背景:小菜和大鸟去大排档吃夜宵,点了一份2份炒面,小菜的很好吃,但大鸟的忘了放盐了。导致两份出自同一个厨师的炒面,味道不同。
而麦当劳肯德基在全国各地的口味都是一样的,因为他们中间有严格的制作流程规范。
后来引申出我们要建造一个人,五官和脚、手都是必须存在的(这些可以抽象定义)。但高矮胖瘦则需要另外声明(去继承之前的抽象类即可)。
先看定义吧:
当我们需要实列化一个复杂的类(比如一个人),以得到不同结构类型和不同的内部状态的对象时,我们可以用不同的类对它们的实列化操作逻辑分别进行封装,这些类我们就称之为建造者。
需求
首先需求是需要造一个大眼睛的人和小眼睛的人,那我们先创建一个person类
当我们想要创建不同的类型的人时,人的属性都不同,如果后续扩展更多属性,就得修改原先的person类,违反了开闭原则。
\
第一步:创建建造者类
但是仔细想一想,一个正常人,手、脚、身体都是有的。那我们用建造者模式怎么实现呢?就把这一个人抽象出来呗。
\
第二步:创建具体建造者类
当我们要创建一个胖子的时候,就去继承这个建造者类。
我们可以把一个人身体的基本部分构造出来(因为这是必须的),
红框中的部分不能加,后来想明白了,因为需要指导类(Director)来造人,拓展部分不会放进指导类中。
第三步:创建指导类
这个类可以指导我们(客户端)怎么创建对象
客户端代码
\
总结:
Builder 是创建一个Product对象的各个部件指定的抽象接口。比如抽象的人
ConcreteBuilder 是具体的建造者,实现了Builder接口,构造和装配各个部件(身体、手、脚).比如胖子
Diretor 是指挥者,用户可以操作指挥者,传入需求(胖子or瘦子)去构建产品。
建造者模式一般是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(比如先身体、再手、再脚),但对象内部通常面临着复杂的变化(胖人和瘦人),
其好处是可以时建造代码和表示代码分离,由于建造者(Builder)隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。