建造者模式又叫做生成器模式,是23种设计模式中的一种创建型模式。建造者模式,顾名思义,就是为创建对象而生的模式。
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 如果我们使用了建造者模式,客户端只需要指定具体的建造类型,就可以创建出不同的对象,而每个对象的建造过程以及部件内部的建造细节是对客户端不可见的。也就是说,建造者模式很好的封装了一个对象的构建过程,并且把这个对象的每个组成部分进行了封装。从而可以到达另一个目的-复用。可以发现,建造者模式也是围绕着面向对象封装这一特点进行设计的。
Product:建造者模式中所要生产的产品,即要创建的复杂对象,这个复杂的对象至少由1个部分(部件)组成。 AbstractBuilder:定义了一些抽象接口,以表明产品对象的各个组成成分。这些接口实际上代表了要创建一个复杂的对象需要提供哪些部件(也就是这个复杂对象由哪几部分组成),但并不涉及具体的部件的创建。每个部件具体的创建交由ConcreteBuilder来实现。同一个部件,不同的ConcreteBuilder可以提供不同的实现。
ConcreteBuilder:继承自AbstractBuilder,内部持有一个初始化好的Product实例,实现AbstractBuilder定义的接口,来为这个product实例(即我们需要构建的复杂对象)的构建提供部件。针对不同的业务场景,我们可以对每一个部件提供不一样的实现。 然后把这些构建好的部件(即组成复杂对象的部分)设置给product实例。
Director:调用具体建造者builder来创建复杂对象的各个部件,通常这个builder是作为一个参数从外界传递给director对象的,在director中不涉及产品的具体信息,director只负责操纵builder,来完成复杂对象各个部件的创建或者通过操作builder使复杂对象的各个部件按某种顺序创建。
建造者模式
/// 产品类
class Product: NSObject {
var parts: [String] = [String]()
/// 添加部件
func add(_ part: String) {
parts.append(part)
}
/// 展示成品
func show() {
for i in 0 ..< parts.count {
print(parts[i])
}
}
}
/// 抽象建造者类
protocol IBuilder {
func buildPartA()
func buildPartB()
func buildPartC()
/// ...
func getResult() -> Product
}
class AbstractBuilder: NSObject, IBuilder {
private var product: Product = Product()
func buildPartA() {
}
func buildPartB() {
}
func buildPartC() {
}
func getResult() -> Product {
return product
}
}
/// 具体建造者类1
class ConcreteBuilder1: AbstractBuilder {
private var product: Product = Product()
override func buildPartA() {
product.add("partA1")
}
override func buildPartB() {
product.add("partB1")
}
override func buildPartC() {
product.add("partC1")
}
override func getResult() -> Product {
return product
}
}
/// 具体建造者类2
class ConcreteBuilder2: AbstractBuilder {
private var product: Product = Product()
override func buildPartA() {
product.add("partA2")
}
override func buildPartB() {
product.add("partB2")
}
override func buildPartC() {
product.add("partC2")
}
override func getResult() -> Product {
return product
}
}
/// 指挥者类
class Director: NSObject {
/// 使用客户端提供的builder创建产品的各个部件
func construct(_ builder: AbstractBuilder) {
builder.buildPartA()
builder.buildPartB()
builder.buildPartC()
}
}
/// 客户端调用
let director = Director()
let builder1 = ConcreteBuilder1()
director.construct(builder1)
let product = builder1.getResult()
product.show()
建造者模式中,客户端不但要认识director类,还要认识builder类,结合简单工厂模式,给director传递一个枚举值,director内部根据枚举值创建对应的builder,并让builder构造复杂对象的各个组成部分,最后把复杂对象返回。这样的好处是,客户端只感知director类和product类,缺点是director中的逻辑变得复杂,且不符合开放-封闭原则。
java设计模式之建造者模式 建造者模式(Builder Pattern)- 最易懂的设计模式解析
文/VV木公子(简书作者) PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载请联系作者获得授权,并注明出处。