----------------设计模式:建造者设计模式---------------------
详解:
Builder是为创建一个Product对象的各个部件指定的抽象接口,Prodcut是具体的产品。Director是一个建造者,由它指挥使用BUilder。ConcreteBuilder是具体的建造,实现Builder接口的各个方法。
详解:主方法调用(建造者)Director(建造者)调用Builder(接口(抽象的建造方法))ConcreteBuilder(实现类(实现具体的建造方法))并且调用具体的产品
建造者模式适用场景
建造者模式是在当创建复杂对象的复杂算法一个独立与该对象的组成部分以及它们的装配方式时适用的模式。
![](https://img-blog.csdnimg.cn/img_convert/832e64de8b5b458ad157789c0900b517.png)
示例代码:
<<建造者设计模式.zip>>
--------------------设计模式:建造者设计模式-----------------
概念:今天我们讨论一下 Builder 建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个Builder 可以使接口也可以是抽象类,在这里我们使用抽象类。
来自 <https://www.runoob.com/w3cnote/builder-pattern-2.html>
![](https://img-blog.csdnimg.cn/img_convert/0d73ed616c51492850a4d3c11a521f3c.png)
![](https://img-blog.csdnimg.cn/img_convert/a7fdb4445c17c0e87c7939eb7beb523c.png)
![](https://img-blog.csdnimg.cn/img_convert/cc2e457be0a585b305ef48ddfb1bdafb.png)
![](https://img-blog.csdnimg.cn/img_convert/465460bafdc29da651559125a0bf7d3f.png)
![](https://img-blog.csdnimg.cn/img_convert/22d8d8f634cd23533eb6abd3b7b2fa1d.png)
总结:关于Builder模式,我们一定要分清和模板方法的区别,其实就是到底谁承担了"监工"的责任,在模板方法中父类承担了这个责任,而在Builder中,有另外一个专门的类来完成这样的操作,这样做的好处是类的隔离,比如说在Main中,用户根本就不知道有Builder这个抽象类,同样的Director这个监工的根本就不管到底是哪一个实现类,因为任何一个都会被转换为父类,然后进行处理(面向抽象编程的思想),因此很好的实现了隔离,同样的这样设计的好处是复用了,隔离的越好复用起来就越方便,我们完全可以思考,假如还有另外一个监工,使用了不同的construct方法来组装这些复杂的事件,那么对于原来的代码我们不用做任何的修改,只用增加这样的一个监工类,然后定义好相应的方法就好了,之后再Main中使用,这样的一种思想使得我们不用修改源代码,复用(Builder以及其子类)就很方便了,同样的,如果想增加一个新的Builder的子类,只要照着父类的方法进行填充,再加上自己的方法就好了,完全不用修改代码,这也是一种复用,因此这种复用(组件)的思想在设计模式中随处可见,本质就是高内聚低耦合,组件开发,尽量不修改原来的代码,有可扩展性,理解了这一点,我们再看看模板方法,责任全放在了父类里,如果责任需要改变,则必须要修改父类中的责任方法了,这样就修改了原来的代码,不利于复用,这也是两者的本质区别。
来自 <https://www.runoob.com/w3cnote/builder-pattern-2.html>
设计模式文档:https://www.jianshu.com/p/e6c0abf420cf
例如:有一个汽车装配工(执行类),一天要安装很多汽车(抽象类),其中包括"安装宝马汽车(实现类)","安装丰田汽车(实现类)",当这个汽车装配工安装宝马汽车时候,就把宝马汽车的零部件安装好(监工类),当这个汽车装配工安装丰田汽车时候,就把丰田汽车的零部件安装好(监工类).
如:安装了宝马牌轮胎的车叫宝马汽车(输出类),安装了丰田牌轮胎的车叫丰田车(输出类x).
来自 <https://www.likecs.com/show-305985777.html>
1) 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
3) 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
4) 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭原则”
5) 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
6) 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式.
7) 抽象工厂模式VS建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。
而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品
————————————————
版权声明:本文为CSDN博主「smileTimLi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35275233/article/details/105656099