一、概述
Builder属于创建型模式中的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二、适用性
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
三、参与者
1. Builder:为创建一个Product对象的各个部件指定抽象接口。
2. ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示,提供一个检索产品的接口。
3. Director:构造一个使用Builder接口的对象。
4. Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
四、类图
五、代码实现
1. Builder:为创建一个Product对象的各个部件指定抽象接口。
PersonBuilder.swift
import Foundation
/// PersonBuilder为创建一个Person对象的各个部件指定抽象接口
protocol PersonBuilder {
/// 造头
func buildHead()
/// 造身体
func buildBody()
/// 造脚
func buildFoot()
/// 造人
func buildPerson() ->Person
}
2. ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示,提供一个检索产品的接口。
ManBuilder.swift
import Foundation
/// ManBuilder实现PersonBuilder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。
class ManBuilder: PersonBuilder {
/// 人员对象
let person:Person = Man()
// MARK: 造头
func buildHead() {
person.head = "建造男人的头"
print(person.head)
}
// MARK: 造身体
func buildBody() {
person.body = "建造男人的身体"
print(person.body)
}
// MARK: 造脚
func buildFoot() {
person.foot = "建造男人的脚"
print(person.foot)
}
// MARK: 造人
func buildPerson() ->Person {
return person
}
}
3. Director:构造一个使用Builder接口的对象。
PersonDirector.swift
import Foundation
/// PersonDirector构造一个使用PersonBuilder接口的对象。
class PersonDirector {
// MARK: 通过装配器构造人员对象
func constructPerson(pb:PersonBuilder) ->Person {
pb.buildHead()
pb.buildBody()
pb.buildFoot()
return pb.buildPerson()
}
}
4. Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
a) Person.swift
import Foundation
/// Person 表示被构造的复杂对象
class Person {
/// 头
var head:String = ""
/// 身体
var body:String = ""
/// 脚
var foot:String = ""
}
b) Man.swift
import Foundation
/// 男人
class Man: Person {
}
六、测试
1. 代码
// 建造者模式
// 构造器
let pd = PersonDirector()
// 装配器
let mb = ManBuilder()
// 创建对象
let person = pd.constructPerson(mb)
2. 运行结果
建造男人的头
建造男人的身体
建造男人的脚