将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果
多个部分或零件,都可以装配到一个对象中,但是产生的运行结果又不相同
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用
当初始化一个对象特别复杂,如参数多,切很多参数都具有默认值时
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
/*
建造者模式
*/
///Product产品类----抽象产品类,
//子类必须设置操作系统
class Computer{
var mboard:String!
var mdesplay:String!
var mOS:String!
///设置主板
func setBoard(board:String){
mboard = board
}
///设置显示器
func setDisplay(desplay:String){
mdesplay = desplay
}
///设置操作系统
func setOS(){
fatalError("子类必须实现--设置操作系统")
}
func debugString(){
debugPrint(mboard + mdesplay + mOS)
}
}
///产品类
class Mac: Computer {
override func setOS() {
mOS = "MAC-OS-X10.10"
}
}
///Builder---抽象builder类,规范产品的组建,一般由子类实现具体组建过程
protocol Builder{
///设置主机
func buildBoard(board:String)
///设置显示器
func buildDesplay(desplay:String)
///设置操作系统
func buildeOS()
///创建产品
func create()->Computer
}
///ConcreteBuilder--具体builder类,实现具体组建过程
class MacBuilder: Builder {
var computer:Computer = Mac()
func create() -> Computer {
return computer
}
func buildBoard(board: String) {
computer.setBoard(board)
}
func buildDesplay(desplay: String) {
computer.setDisplay(desplay)
}
func buildeOS() {
computer.setOS()
}
}
///Director---统一组装过程,构造computer,封装构建复杂产品对象的过程,对外隐藏构建细节
class Director {
var mbuilder:Builder!
init(builder:Builder){
mbuilder = builder
}
///构造computer
func construct(board:String,display:String){
mbuilder.buildBoard(board)
mbuilder.buildDesplay(display)
mbuilder.buildeOS()
}
}
class Test {
var builder:Builder = MacBuilder()
func test(){
let director = Director(builder: builder)
///不需要知道构建过程,细节
director.construct("英特尔主板", display: "Retina显示器")
debugPrint(builder.create().debugString())
}
}
Test().test()