建造者设计模式6
一、定义
将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。产品的组成部分是不变的,但每一部分是可以灵活选择的。
二、建造者需要的几个角色
1.Product产品类。这个产品类比较复杂,内部有许多其它类的对象的引用,可以视为此产品类的逻辑上必不可少的“组成部分”。当我们要构造出此产品的时候,产品持有的其它引用也必须得到初始化。
2.Builder建造者。这是一个抽象接口,用于定义生产产品的各个“组成部分”,并提供生成这个产品的方法。
3.ConcreteBuilder建造者实现类。具体生产出产品对象的各个组成部分。
4.Director指挥者。调用建造者实现类来生产出产品的各个组成部分,并将其装配到产品类中。
三、建造模式心法
建造模式与工厂模式比较
工厂设计模式关心的是创造哪一个产品,会有一个逻辑判断返回哪一个产品给客户端。
建造者设计模式关心的是如何创建复杂对象。
使用场景:需要生成的产品对象有复杂的内部结构,通常包含多个成员属性。
现在可以解释官方的定义:将一个复杂对象的构建(产品复杂的构造过程)和表示(用户拿到的产品对象的地方,或者说是能够进行调用产品对象的环境)分离,使同样的构建过程(抽象建造者定义的统一接口,Builder类的意思)可以创建不同的表示(不同的具体建造者,产生不同的产品)。简单说:让调用环境与产品复杂的构造逻辑解耦。
如果是Product product = Director.getProduct(具体建造者类);即使需求变了,只需要修改具体建造者类的代码。因此,在我们的调用环境中,避免了与产品的复杂构造逻辑耦合,是建造者模式的一大好处。
四、例子
常见的使用
StringBulider sb = new StringBuilder().append().append().toString();
Header header = new HeaderBuilder()
.setClientId(SOAHeader.SOAP_CLIENT_ID)
.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID)
.buildHeader();
五、优缺点
优点:
1.隐藏了产品的构造过程,避免在客户端与产品类复杂的构造逻辑耦合。
2.具体建造者相互独立,便于为系统增加新的建造者。
缺点:如果产品众多,则意味着内部的成员种类中多,需要创建多个建造者来满足这样的需求。这样的话,系统可能会很复杂并且庞大,难以维护。
分割线--------------------------------------------------------------------------------------------
下一篇:原型设计模式7
刻意练习:
(1)建造者设计模式是什么?
(2)考虑使用建造者设计模式的使用场景
(3)建造者设计模式的优点
(4)建造者设计模式的缺点
(5)同样是创建对象,为什么不用工厂设计模式?
(6) 思考StringBuilder的巧妙之处。字符串由一个一个的字符组成,字符就是内部的对象。