[3] [对象创建] ( 4 ) 建造者模式(生成器模式) builder
总结
-
创建具有不同配置的对象时, 可以使用Buildr模式.
-
多步骤构建复杂的对象.
-
可以避免构造方法的参数列表过长.
-
在链式调用中创建对象.
-
将创建对象和使用对象分离, 严格遵循单一职责原则.
java例子
package v11_builder.java;
class Milktea {
double price;
String topping = "boba";
String tea = "regularMilktea";
Integer suger = 100;
public Milktea() {
this.price = 7.0;
}
public double getPrice() {
return this.price;
}
}
class SignatureMilktea extends Milktea {
public SignatureMilktea() {
this.price = 5.7;
}
}
class OolongMilktea extends Milktea {
public OolongMilktea() {
this.price = 4.5;
}
}
interface MilkteaBuilder {
void reset();
void addTopping();
void addTea();
void addSugerLevel();
Milktea getProduct();
}
class SignatureMilkteaBuilder implements MilkteaBuilder {
private SignatureMilktea product;
public void reset() {
this.product = new SignatureMilktea();
}
public void addTopping() {
product.topping = "boba";
}
public void addTea() {
product.tea = "signature tea";
}
public void addSugerLevel() {
product.suger = 100;
}
public Milktea getProduct() {
System.out.format("Signature milktea: %s %s %s\n", this.product.topping, this.product.tea, this.product.suger);
return this.product;
}
}
class OolongMilkteaBuilder implements MilkteaBuilder {
private OolongMilktea product;
public void reset() {
this.product = new OolongMilktea();
}
public void addTopping() {
product.topping = "grass jelly";
}
public void addTea() {
product.tea = "oolong";
}
public void addSugerLevel() {
product.suger = 50;
}
public Milktea getProduct() {
System.out.format("Oolong milktea: %s %s %s\n", this.product.topping, this.product.tea, this.product.suger);
return this.product;
}
}
class CustomizedMilkteaBuilder {
private Milktea product;
public void reset() {
this.product = new Milktea();
}
public void addTopping(String boba) {
product.topping = boba;
}
public void addTea(String tea) {
product.tea = tea;
}
public void addSugerLevel(Integer sugar) {
product.suger = sugar;
}
public Milktea getProduct() {
System.out.format("Customized milktea: %s %s %s\n", this.product.topping, this.product.tea, this.product.suger);
return this.product;
}
}
class MilkteaDirector {
private MilkteaBuilder milkteaBuilder;
public MilkteaDirector(MilkteaBuilder builder) {
this.milkteaBuilder = builder;
}
public void changeBuilder(MilkteaBuilder builder) {
this.milkteaBuilder = builder;
}
public Milktea makeMiketea() {
this.milkteaBuilder.reset();
this.milkteaBuilder.addTopping();;
this.milkteaBuilder.addTea();
this.milkteaBuilder.addSugerLevel();
return this.milkteaBuilder.getProduct();
}
public Milktea make(String type) {
if (type == "signature") {
this.changeBuilder(new SignatureMilkteaBuilder());
} else if (type == "oolong") {
this.changeBuilder(new OolongMilkteaBuilder());
}
return this.makeMiketea();
}
}
public class TuringBobaShop {
public static void main(String[] args) {
MilkteaDirector director = new MilkteaDirector(new SignatureMilkteaBuilder());
director.makeMiketea();
director.changeBuilder(new OolongMilkteaBuilder());
director.makeMiketea();
director.make("signature");
director.make("oolong");
CustomizedMilkteaBuilder builder = new CustomizedMilkteaBuilder();
builder.reset();
builder.addTopping("boba");
builder.addTea("Oolong");
builder.addSugerLevel(10);
builder.getProduct();
}
}


C++例子
// 抽象产品
class House{
//....
};
// 具体产品
class StoneHouse: public House{
//....
};
// 抽象Builder
class HouseBuilder {
public:
House* GetResult(){
return pHouse;
}
virtual ~HouseBuilder(){}
protected:
House* pHouse;
virtual void BuildPart1()=0;
virtual void BuildPart2()=0;
virtual void BuildPart3()=0;
virtual void BuildPart4()=0;
virtual void BuildPart5()=0;
};
// 具体Builder 石头房子
class StoneHouseBuilder: public HouseBuilder{
protected:
virtual void BuildPart1(){
//pHouse->Part1 = ...;
}
virtual void BuildPart2(){ /* 具体过程... */ }
virtual void BuildPart3(){ /* 具体过程... */ }
virtual void BuildPart4(){ /* 具体过程... */ }
virtual void BuildPart5(){ /* 具体过程... */ }
};
// 主管类, 简化具体builder的调用过程
class HouseDirector{
public:
// builder接口, 可以是石头房子,木头房子,草房子...
HouseBuilder* pHouseBuilder;
HouseDirector(HouseBuilder* pHouseBuilder){
this->pHouseBuilder=pHouseBuilder;
}
House* Construct(){
pHouseBuilder->BuildPart1();
for (int i = 0; i < 4; i++){
pHouseBuilder->BuildPart2();
}
bool flag=pHouseBuilder->BuildPart3();
if(flag){
pHouseBuilder->BuildPart4();
}
pHouseBuilder->BuildPart5();
return pHouseBuilder->GetResult();
}
};

浙公网安备 33010602011771号