利用类构造函数默认参数,创建一个类。
之所以用Builder Pattern是因为要根据不同属性来创建不同的对象。
正如如下步骤:1.name 2.选择一个产品 3.客户定制一个产品
client:
// Step 1 - Ask for name
let@H_404_12@ name ="Joe"@H_404_12@;
// Step 2 - Select a Product
let@H_404_12@ builder =BurgerBuilder@H_404_12@.getBuilder@H_404_12@(Burgers@H_404_12@.BIGBURGER@H_404_12@);
// Step 3 - Customize burger?
builder.@H_404_12@setMayo@H_404_12@(@H_404_12@false@H_404_12@);@H_404_12@
builder.@H_404_12@setCooked@H_404_12@(@H_404_12@Burger@H_404_12@.@H_404_12@Cooked.@H_404_12@WELLDONE@H_404_12@);@H_404_12@
let@H_404_12@ order =builder@H_404_12@.buildObject@H_404_12@(name@H_404_12@);
order@H_404_12@.@H_404_12@printDescription();@H_404_12@
@H_404_12@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pattern:
enum@H_404_12@ Burgers {
case@H_404_12@ STANDARD; case@H_404_12@ BIGBURGER;case@H_404_12@ SUPERVEGGIE;
}
class@H_404_12@ BurgerBuilder {
private@H_404_12@ var@H_404_12@ veggie =false@H_404_12@;
private@H_404_12@ var@H_404_12@ pickles =false@H_404_12@;
private@H_404_12@ var@H_404_12@ mayo =true@H_404_12@;
private@H_404_12@ var@H_404_12@ ketchup =true@H_404_12@;
private@H_404_12@ var@H_404_12@ lettuce =true@H_404_12@;
private@H_404_12@ var@H_404_12@ cooked =Burger@H_404_12@.Cooked@H_404_12@.NORMAL@H_404_12@;
private@H_404_12@ var@H_404_12@ patties =2@H_404_12@;
private@H_404_12@ var@H_404_12@ bacon =true@H_404_12@;
@H_404_12@private @H_404_12@ init() {@H_404_12@
@H_404_12@// do nothing
}
func@H_404_12@ setVeggie(choice: Bool@H_404_12@) {
self@H_404_12@.veggie@H_404_12@ = choice;
if@H_404_12@ (choice) {
self@H_404_12@.bacon@H_404_12@ =false@H_404_12@;
}
}
func@H_404_12@ setPickles(choice: Bool@H_404_12@) { self@H_404_12@.pickles@H_404_12@ = choice; }
func@H_404_12@ setMayo(choice: Bool@H_404_12@) { self@H_404_12@.mayo@H_404_12@ = choice; }
func@H_404_12@ setKetchup(choice: Bool@H_404_12@) { self@H_404_12@.ketchup@H_404_12@ = choice; }
func@H_404_12@ setLettuce(choice: Bool@H_404_12@) { self@H_404_12@.lettuce@H_404_12@ = choice; }
func@H_404_12@ setCooked(choice: Burger@H_404_12@.Cooked@H_404_12@) { self@H_404_12@.cooked@H_404_12@ = choice; }
func@H_404_12@ addPatty(choice: Bool@H_404_12@) { self@H_404_12@.patties@H_404_12@ = choice ?3@H_404_12@ : 2@H_404_12@; }
func@H_404_12@ setBacon(choice: Bool@H_404_12@) { self@H_404_12@.bacon@H_404_12@ = choice; }
func@H_404_12@ buildObject(name: String@H_404_12@) -> Burger@H_404_12@ {
return@H_404_12@ Burger@H_404_12@(name: name,veggie:veggie@H_404_12@,patties: patties@H_404_12@,
pickles:pickles@H_404_12@,mayo: mayo@H_404_12@,ketchup:ketchup@H_404_12@,
lettuce:lettuce@H_404_12@,cook: cooked@H_404_12@,bacon:bacon@H_404_12@);
}
class@H_404_12@ func@H_404_12@ getBuilder(burgerType:Burgers@H_404_12@) ->BurgerBuilder@H_404_12@ {
var@H_404_12@ builder:BurgerBuilder@H_404_12@;
switch@H_404_12@ (burgerType) {
case@H_404_12@ .BIGBURGER: builder = BigBurgerBuilder@H_404_12@();
case@H_404_12@ .SUPERVEGGIE: builder = SuperVeggieBurgerBuilder@H_404_12@();
case@H_404_12@ .STANDARD: builder = BurgerBuilder@H_404_12@();
}
return@H_404_12@ builder;
}
}
class@H_404_12@ BigBurgerBuilder :BurgerBuilder@H_404_12@ {
@H_404_12@private @H_404_12@ override @H_404_12@init() {@H_404_12@
super@H_404_12@.init@H_404_12@();
self@H_404_12@.patties@H_404_12@ =4@H_404_12@;
self@H_404_12@.bacon@H_404_12@ =false@H_404_12@;
}
override@H_404_12@ func@H_404_12@ addPatty(choice:Bool@H_404_12@) {
@H_404_12@fatalError@H_404_12@(@H_404_12@"Cannot add patty to Big Burger");@H_404_12@
}
}
class@H_404_12@ SuperVeggieBurgerBuilder :BurgerBuilder@H_404_12@ {
@H_404_12@private @H_404_12@ override @H_404_12@init() {@H_404_12@
super@H_404_12@.init@H_404_12@();
self@H_404_12@.veggie@H_404_12@ =true@H_404_12@;
self@H_404_12@.bacon@H_404_12@ =false@H_404_12@;
}
override@H_404_12@ func@H_404_12@ setVeggie(choice:Bool@H_404_12@) {
@H_404_12@// do nothing - always veggie
}
override@H_404_12@ func@H_404_12@ setBacon(choice:Bool@H_404_12@) {
@H_404_12@fatalError@H_404_12@(@H_404_12@"Cannot add bacon to this burger");@H_404_12@
}
}