建造者模式:设计模式系列(三)
in Archived / Pattern
建造者模式(Builder Pattern):是将一些复杂对象的构建过程分离于表示,让大量同本质的对象通过相同的构建步骤,但由于不同的细微差异而表达出来的模式,归类为创建型模式。
这一模式的解读分为以下几个方面:
- 多种相同本质且复杂的对象。
- 抽象建造者。
- 实现建造者。
- 建造指挥者。
这一模式在建立思考过程如下:
- 建造指挥者需要给Coder提供一些复杂却本质相同的对象,所以找到了实现建造者。
- 实现建造者根据抽象建造者提供的指示创建复杂对象。
- 复杂对象可以是单独的一个整体,也可以是多个同本质但有差异整体,如果是同本质有差异的整体,则可对对象进行抽象处理出接口或协议。
从这里进行一一对应则能明白,建造者模式的结构有对象类(可能需要对象的接口或协议)、建造者接口或协议、建造者实现类、指挥者实现类。
建造者模式示例代码如下(Swift语言):
class Object{
var attribute1:String = "";
var attribute2:String = "";
func show(){
print("attribute1:\(attribute1),attribute2:\(attribute2)");
}
func setAttribute1(attribute1:String){
self.attribute1 = attribute1;
}
func setAttribute2(attribute2:String){
self.attribute2 = attribute2;
}
}
protocol BuilderBluePrint{
func setAttribute(attribute1:String,attribute2:String);
func getObject()->Object;
}
class Builder:BuilderBluePrint{
private var object = Object();
func setAttribute(attribute1:String,attribute2:String){
object.setAttribute1(attribute1);
object.setAttribute2(attribute2);
}
func getObject()->Object{
return object;
}
}
class Manager{
private var builder = Builder();
func getObject1()->Object{
builder.setAttribute("A1",attribute2: "A2");
return builder.getObject();
}
func getObject2()->Object{
builder.setAttribute("B1", attribute2: "B2");
return builder.getObject();
}
}
var manager = Manager();
var o1 = manager.getObject1();
o1.show();
var o2 = manager.getObject2();
o2.show();
代码分析:Manager
类是一个指挥者实现类,跟Object
没有直接联系,而是通过调用建造者实现类Builder
建造获取并返回Object
的,而BuilderBluePrint
则是让建造者知道怎么去建造,对于我们的最终需求—Object
,它是由自己的方法进行表示的,但整个构建过程却是通过Manager
类来完成。以上代码的输出结果如下:
attribute1:A1,attribute2:A2
attribute1:B1,attribute2:B2
这里需要对工厂模式进行区分,工厂模式重点是获取一系列的对象且这些对象相互结构等级或许不一样,还有就是对象生产过程是需要Coder设置;而建造者模式获取的对象是一个完整的整体,而且整个构造过程对调用者隔离,由指挥者实现类通过建造者实现。
总结:建造者模式给人感觉就是客户在跟PM打交道,PM会根据客户的需求提供产品,但产品怎么做出来客户不需要知道,只要PM知道需求然后跟建造者说做什么之后就能拿到产品给客户使用了。此模式跟工厂模式一样在大量创建部件时可以提升编程效率,在不需要调整构造的算法时,这是个很好用的设计模式。