建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
该模式的主要优点如下:
1. 各个具体的建造者相互独立,有利于系统的扩展。
2. 客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
1. 产品的组成部分必须相同,这限制了其使用范围。
2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
/// 主食
enum StapleFood {
case hamburger
case chicken_rice
}
/// 饮料
enum Drink {
case cola
case cafe
}
/// 小食
enum Snacks {
case chips
case egg_tart
}
/// 套餐类型
enum KFCPackageType {
case A
case B
}
class Package {
var stapleFood: StapleFood?
var dirnk: Drink?
var snacks: Snacks?
func printInfo() {
print("主食:\(self.stapleFood!),饮料:\( self.dirnk!),小食:\(self.snacks!)")
}
}
class Builder {
func getKFCPackage(type: KFCPackageType) -> Package {
switch type {
case .A:
let package = Package()
package.stapleFood = .hamburger
package.dirnk = .cola
package.snacks = .chips
return package
case .B:
let package = Package()
package.stapleFood = .chicken_rice
package.dirnk = .cafe
package.snacks = .egg_tart
return package
}
}
}
let builder = Builder()
builder.getKFCPackage(type: .A).printInfo()
builder.getKFCPackage(type: .B).printInfo()
//主食:hamburger,饮料:cola,小食:chips
//主食:chicken_rice,饮料:cafe,小食:egg_tart