建造者模式

251 阅读2分钟

背景:小菜和大鸟去大排档吃夜宵,点了一份2份炒面,小菜的很好吃,但大鸟的忘了放盐了。导致两份出自同一个厨师的炒面,味道不同。

而麦当劳肯德基在全国各地的口味都是一样的,因为他们中间有严格的制作流程规范。

后来引申出我们要建造一个人,五官和脚、手都是必须存在的(这些可以抽象定义)。但高矮胖瘦则需要另外声明(去继承之前的抽象类即可)。

先看定义吧:

当我们需要实列化一个复杂的类(比如一个人),以得到不同结构类型和不同的内部状态的对象时,我们可以用不同的类对它们的实列化操作逻辑分别进行封装,这些类我们就称之为建造者。

需求

首先需求是需要造一个大眼睛的人和小眼睛的人,那我们先创建一个person类

当我们想要创建不同的类型的人时,人的属性都不同,如果后续扩展更多属性,就得修改原先的person类,违反了开闭原则。

\

第一步:创建建造者类

但是仔细想一想,一个正常人,手、脚、身体都是有的。那我们用建造者模式怎么实现呢?就把这一个人抽象出来呗。

\

第二步:创建具体建造者类

当我们要创建一个胖子的时候,就去继承这个建造者类。

我们可以把一个人身体的基本部分构造出来(因为这是必须的),

红框中的部分不能加,后来想明白了,因为需要指导类(Director)来造人,拓展部分不会放进指导类中。

第三步:创建指导类

这个类可以指导我们(客户端)怎么创建对象

客户端代码

\

总结:

Builder 是创建一个Product对象的各个部件指定的抽象接口。比如抽象的人

ConcreteBuilder 是具体的建造者,实现了Builder接口,构造和装配各个部件(身体、手、脚).比如胖子

Diretor 是指挥者,用户可以操作指挥者,传入需求(胖子or瘦子)去构建产品。

建造者模式一般是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(比如先身体、再手、再脚),但对象内部通常面临着复杂的变化(胖人和瘦人),

其好处是可以时建造代码和表示代码分离,由于建造者(Builder)隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。