建造者模式(Builder Pattern)简单随笔
提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变。
一、建造者模式简介
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
二、解决的问题 主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
三、建造者模式图解
现以客户向包工头建立一所房子为例:
builder以及继承类如下:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderPatternSam
7 {
8 public abstract class Builder
9 {
10 public abstract void CreateWall();
11 public abstract void CreateDoll();
12 public abstract void CreateFloor();
13 public abstract House ReturnHouseModel();
14 }
15 }
16
17 public class BlueBuilder:Builder
18 {
19 House house = new House();
20 public override void CreateWall()
21 {
22 //throw new NotImplementedException();
23 house.Add("Create blue Wall");
24 }
25
26 public override void CreateDoll()
27 {
28 //throw new NotImplementedException();
29 house.Add("Create blue Doll");
30 }
31
32 public override void CreateFloor()
33 {
34 //throw new NotImplementedException();
35 house.Add("Create Blue Floor");
36 }
37
38 public override House ReturnHouseModel()
39 {
40 //throw new NotImplementedException();
41 return house;
42 }
43 }
44
45 public class WhiteBuilder : Builder
46 {
47 House house = new House();
48 public override void CreateWall()
49 {
50 //throw new NotImplementedException();
51 house.Add("Create White Wall");
52 }
53
54 public override void CreateDoll()
55 {
56 //throw new NotImplementedException();
57 house.Add("Create White Doll");
58 }
59
60 public override void CreateFloor()
61 {
62 //throw new NotImplementedException();
63 house.Add("Create White Floor");
64 }
65
66 public override House ReturnHouseModel()
67 {
68 //throw new NotImplementedException();
69 return house;
70 }
71 }
产品为房子:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderPatternSam
7 {
8 public class House
9 {
10 Queue<string> queue = new Queue<string>();
11 public void Add(string str)
12 {
13 queue.Enqueue(str);
14 }
15
16 public void Show()
17 {
18 if (queue != null)
19 {
20
21 Console.WriteLine("**************************House Building!****************************");
22 while (queue != null && queue.Count > 0)
23 {
24 Console.WriteLine(queue.Dequeue().ToString());
25 }
26 }
27 Console.WriteLine("---------------------------House Builded!----------------------------");
28 }
29 }
30 }
31
包工头通过 命令Builder来生成相应的房子
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderPatternSam
7 {
8 public class HouseCreator
9 {
10 public void Create(Builder builder)
11 {
12 builder.CreateDoll();
13 builder.CreateFloor();
14 builder.CreateWall();
15 }
16 }
17 }
18
客户端代码:获取房子
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderPatternSam
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 HouseCreator creator = new HouseCreator();
13 Builder builder;
14 Console.WriteLine("please select the house style!");
15 Console.WriteLine("blue ------1");
16 Console.WriteLine("white------2");
17 Console.WriteLine("Exit ------exit");
18 string input = Console.ReadLine();
19
20 while (input.Trim() != "")
21 {
22 if (input == "exit")
23 {
24 Environment.Exit(0);
25 return;
26 }
27 string style;
28 switch (input)
29 {
30 case "1":
31 style = "BlueBuilder";
32 break;
33 case "2":
34 style = "WhiteBuilder";
35 break;
36 default:
37 style = "WhiteBuilder";
38 break;
39 }
40 //string currentPath = System.IO.Directory.GetCurrentDirectory();
41 //string path = currentPath.Substring(0, currentPath.LastIndexOf("bin"));
42 //获取需要生成的房子
43 builder = (Builder)System.Reflection.Assembly.Load("BuilderPatternSam").CreateInstance("BuilderPatternSam." + style);
44 //生成者 生产相应的房子
45 creator.Create(builder);
46
47 /* public void Create(Builder builder)
48 {
49 builder.CreateDoll();
50 builder.CreateFloor();
51 builder.CreateWall();
52 }
53 public abstract class Builder
54 {
55 public abstract void CreateWall();
56 public abstract void CreateDoll();
57 public abstract void CreateFloor();
58 public abstract House ReturnHouseModel();
59 }*/
60 //返回房子给客户
61 House house = builder.ReturnHouseModel();
62 house.Show();
63 input = Console.ReadLine();
64 }
65 }
66 }
67 }
68
其实就是将房子的组建过程进行封装,以适应多种变化。
图示如下:
*******************************************************************************************************
源代码下载:/Files/jasenkin/BuilderPattern.rar
转载于:https://www.cnblogs.com/jasenkin/archive/2010/03/11/1683664.html
建造者模式(Builder Pattern)简单随笔相关推荐
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 设计模式(创建型)之建造者模式(Builder Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- Net设计模式实例之建造者模式(Builder Pattern)(2)
四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...
- 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示
一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...
- UE4 C++设计模式:建造者模式(Builder Pattern)
目录 描述 套路 使用场景 优缺点 UE4实践 具体复杂产品-门派角色 抽象建造者-角色构造器 具体建造者-纯阳角色构造器 具体建造者-七秀角色构造器 创建指挥者(Director)-角色创建指挥器 ...
- 07、人人都会设计模式:建造者模式--Builder
PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...
- 人人都会设计模式---建造者模式--Builder
PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/300cbb9ee- 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1.阅读对象 本 ...
- 建造者模式(Builder)——从组装电脑开始
建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...
- 说说设计模式~建造者模式(Builder)
建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...
- Android设计模式之建造者模式builder
今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...
最新文章
- Android 使用Vector 画图详解
- Java线程池示例:并行计算200000以内的质数个数
- Mabatis(2) 全局配置文件
- JDK、JRE、JVM的区别与联系
- C# 学生信息管理系统 2.0
- C、C++语言中参数的压栈顺序
- topcoder srm 440 div1
- 【一次五款】满速下载百度云神器
- authc过滤器 shiro_shiro原理之过滤器
- file和directory区别
- 身份证上男女识别--非线性问题02
- Gradient Harmonized Single-stage Detector
- 简单介绍一下chatGPT
- 面对困惑,职场之路该怎么走(附案例)---职场达人的忠告(转)
- java 解析swf_基于Java SWFTools实现把pdf转成swf
- 怎么将PPT转换成一个长图,PPT转长图教程
- 北斗授时(卫星授时系统)行业新风口阐述
- Inkspace1.0 插件(1) HelloWorld python例子
- 亚信科技通信、交通行业数据库项目入选“星河”标杆、优秀案例
- steam人机验证一直重复_【Steam】最低只要3元!久玩不腻的生存游戏终于打折了!饥荒快跟上!...
热门文章
- python爬虫案例讲解-Python爬虫案例集合
- 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?
- python培训深圳-深圳python 培训班多少钱?[Python培训]
- python程序员在公司都是做什么的-为什么企业很难招聘到好的python程序员?
- python基础代码-Python基础(代码)
- python微控制器编程从零开始-Python微控制器编程从零开始 使用MicroPython
- python linux命令-Python之路【第三篇】:Linux常用命令
- python人脸识别毕业设计-基于Python的人脸识别系统研究.docx
- dlib做人脸检测判断有没有检测到人脸
- 机器学习笔记-线性模型