[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();
    }   
}





image




image




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();
    }
};





image




posted @ 2023-10-25 12:58  qwertzxc  阅读(12)  评论(0)    收藏  举报