13建造者模式(Builder)

Builder模式的缘起:
    假设创建游戏中的一个房屋House设施,该房屋的构建由几部分组成,且各个部分富于变化。如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正.....
动机(Motivation):
    在软件系统中,有时候面临一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合到一起的算法却相对稳定。
    如何应对种变化呢?如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
意图(Intent):
    将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
                                              -------《设计模式》GOF

结构图(Struct):    
               

协作(Collaborations):
                  

生活中的例子:
             
适用性:
    
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    2.当构造过程必须允许被构造的对象有不同的表示时。
实例代码:
Builder类:

 1  public abstract class Builder
 2     {
 3         public abstract void BuildDoor();
 4         public abstract void BuildWall();
 5         public abstract void BuildWindows();
 6         public abstract void BuildFloor();
 7         public abstract void BuildHouseCeiling();
 8     
 9         public abstract House GetHouse();
10     }

Director类:这一部分是 组合到一起的算法(相对稳定)。

1 public class Director
 2     {
 3       public void Construct(Builder builder)
 4       {
 5           builder.BuildWall();
 6           builder.BuildHouseCeiling();          
 7           builder.BuildDoor();
 8           builder.BuildWindows();
 9           builder.BuildFloor();         
10       }
11     }

ChineseBuilder类

 1    public class ChineseBuilder:Builder
 2     {
 3        private House ChineseHouse = new House();
 4         public override void BuildDoor()
 5         {
 6             Console.WriteLine("this Door 's style of Chinese");
 7         }
 8         public override void BuildWall()
 9         {
10             Console.WriteLine("this Wall 's style of Chinese");
11         }
12         public override void BuildWindows()
13         {
14             Console.WriteLine("this Windows 's style of Chinese");
15         }
16         public override void BuildFloor()
17         {
18             Console.WriteLine("this Floor 's style of Chinese");
19         }
20         public override void BuildHouseCeiling()
21         {
22             Console.WriteLine("this Ceiling 's style of Chinese");
23         }
24         public override House GetHouse()
25         {
26             return ChineseHouse;
27         }
28     }

RomanBuilder类:

 1     class RomanBuilder:Builder
 2     {
 3         private House RomanHouse = new House();
 4         public override void BuildDoor()
 5         {
 6             Console.WriteLine("this Door 's style of Roman");
 7         }
 8         public override void BuildWall()
 9         {
10             Console.WriteLine("this Wall 's style of Roman");
11         }
12         public override void BuildWindows()
13         {
14             Console.WriteLine("this Windows 's style of Roman");
15         }
16         public override void BuildFloor()
17         {
18             Console.WriteLine("this Floor 's style of Roman");
19         }
20         public override void BuildHouseCeiling()
21         {
22             Console.WriteLine("this Ceiling 's style of Roman");
23         }
24         public override House GetHouse()
25         {
26             return RomanHouse;
27         }
28     }

ChineseBuilder和RomanBuilder这两个是:这个复杂对象的两个部分经常面临着剧烈的变化。

 1   public class Client
 2     {
 3         public static void Main(string[] args)
 4         {
 5             Director director = new Director();
 6 
 7             Builder instance;
 8 
 9             Console.WriteLine("Please Enter House No:");
10 
11             string No = Console.ReadLine();
12 
13             string houseType = ConfigurationSettings.AppSettings["No" + No];
14 
15             instance = (Builder)Assembly.Load("House").CreateInstance("House." + houseType);
16 
17             director.Construct(instance);
18 
19             House house= instance.GetHouse();
20             house.Show();
21 
22             Console.ReadLine();
23         }
24     }

 

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <appSettings>
4     <add key="No1" value="RomanBuilder"></add>
5     <add key="No2" value="ChineseBuilder"></add>
6   </appSettings>
7 </configuration>


Builder模式的几个要点:

Builder模式 主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的乘法,而复杂对象的各个部分则经常变化。

Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。

Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder械通常和Composite模式组合使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15原型模式(Prototype)

依赖关系倒置&#xff1a; 动机(Motivate): 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化&#xff1f;如何向“客户…

14工厂方法模式(Factory Method)

耦合关系&#xff1a; 动机(Motivation): 在软件系统中&#xff0c;由于需求的变化&#xff0c;"这个对象的具体实现"经常面临着剧烈的变化&#xff0c;但它却有比较稳定的接口。 如何应对这种变化呢&#xff1f;提供一种封装机制来隔离出"这个易…

mysql 更新错误1062_mysql 出现1062错误怎么办

mysql 出现1062错误的解决办法&#xff1a;首先打开mysql的配置文件【my.cnf】&#xff1b;然后在client和mysqld下面加上相关代码&#xff1b;最后存关闭后重启mysql即可。mysql 出现1062错误的解决办法&#xff1a;两个instance的版本接近&#xff0c;猜测不是版本问题。执行…

21适配器模式(Adapter Pattern)

适配&#xff08;转换&#xff09;的概念无处不在...... 适配&#xff0c;即在不改变原有实现的基础上&#xff0c;将原先不兼容的接口转换为兼容的接口。 例如&#xff1a;二转换为三箱插头&#xff0c;将高电压转换为低电压等。 动机(Motivate): 在软件系统中&#…

22桥接模式(Bridge Pattern)

动机(Motivate): 在软件系统中&#xff0c;某些类型由于自身的逻辑&#xff0c;它具有两个或多个维度的变化&#xff0c;那么如何应对这种“多维度的变化”&#xff1f;如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化&#xff0c;而又不引入额外的复杂度…

mysql动静分离_haproxy的web服务负载均衡、动静分离、 MySQL服务负载均衡、状态监控...

实验环境&#xff1a;基于centos6.6haproxy-Server&#xff1a;172.16.249.98 hostname:node1upsteram server1&#xff1a;172.16.249.100 hostname:node2upstream server2&#xff1a;172.16.249.99 hostname:node3web服务的负载均衡以及状态监控&#xff1a;设置记录hapro…

24组合模式(Composite Pattern)

动机(Motivate): 组合模式有时候又叫做部分-整体模式&#xff0c;它使我们树型结构的问题中&#xff0c;模糊了简单元素和复杂元素的概念&#xff0c;客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。意图(Intent): 将对象组合…

23装饰模式(Decorator Pattern)

子类复子类&#xff0c;子类何其多 假如我们需要为游戏中开发一种坦克&#xff0c;除了各种不同型号的坦克外&#xff0c;我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能&#xff0c;比如水陆两栖功能&#xff0c;比如卫星定位功能等等。 按类继承的作法…

gb2312编码在线转换_python基础学习—04字符串与编码

点击上方蓝字关注我们不迷路&#xff01;字符串与编码一、了解计算机编码1.1 编码定义&#xff1a;将信息从一种形式转换为另外一种形式的过程叫做编码&#xff0c;即信息转换过程举例&#xff1a;信息加密解密、语言翻译1.2 计算机编码定义&#xff1a;将计算机可读信息转换…

25外观模式(Facade Pattern)

动机(Motivate): 在软件开发系统中&#xff0c;客户程序经常会与复杂系统的内部子系统之间产生耦合&#xff0c;而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口&#xff1f;如何将复杂系统的内部子系统与客户程序之间的依赖解耦&#…

mysql mybatis类型对应_Mybatis与数据库的类型对应

Mybatis与数据库的类型对应由于业务的改变&#xff0c;在首次存入数据库时某些int属性并没有赋值&#xff0c;于是默认值就开始污染数据库了。java实体属性对应mysql和SQL Server 和Oracle 数据类型对应1&#xff1a;Java数据类型与MySql数据类型对照表*对于bolb&#xff0c;一…

26享元模式(Flyweight Pattern)

面向对象的代价 面向对象很好地解决了系统抽象性的问题&#xff0c;同时在大多数情况下&#xff0c;也不会损及系统的性能。但是&#xff0c;在 某些特殊的应用中下&#xff0c;由于对象的数量太大&#xff0c;采用面向对象会给系统带来难以承受的内存开销。比如: 图形应用…

mysql一个事务多个log_MySQL识别一个binlog中的一个事物

MySQL测试版本5.7.14设置GTID_MODEONON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事物&#xff0c;slave也只能应用GTID事物)设置binlog格式为row模式做如下操作mysql> insert into test values(1,2);Query OK, 1 row affected (0.…

go for 循环遍历数组并排序_10. Go语言流程控制:for 循环

本文原文&#xff1a;http://golang.iswbm.comGithub&#xff1a;http://github.com/iswbm/GolangCodingTimeGo里的流程控制方法还是挺丰富&#xff0c;整理了下有如下这么多种&#xff1a;if - else 条件语句switch - case 选择语句for - range 循环语句goto 无条件跳转语句de…

27代理模式(Proxy Pattern)

直接与间接&#xff1a; 人们对复杂的软件系统常有一种处理手法&#xff0c;即增加一层间接层&#xff0c;从而对系统获得一种更为灵活、 满足特定需求的解决方案。 …

31模板方法(Template Method)

无处不在的Template Method 如果你只想掌握一种设计模式&#xff0c;那么它就是Template Method! 动机(Motivate): 变化 -----是软件设计的永恒主题&#xff0c;如何管理变化带来的复杂性&#xff1f;设计模式的艺术性和复杂度就在于如何 分析&#xff0c;并发现系统中…

bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析

1、 Apache Tomcat的下载和安装从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件&#xff0c;下载的文件格式可以是zip/tar.gz/exe形式的。如下图所示&#xff0c;在64位windows中使用tomcat&#xff0c;我们可以下载"64-bit Windows.zip",直接解…

33迭代器模式(Iterator Pattern)

动机(Motivate): 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望在不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作…

32命令模式(Command Pattern)

耦合与变化&#xff1a; 耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系&#xff0c;实体对象与行为操作之间也存在耦合关系。 动机(Mot…

34观察者模式(Observer Pattern)

动机(Motivate):在软件构建 过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系” --------一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#x…