建造者模式

来源:互联网 发布:公安大数据应用与问题 编辑:程序博客网 时间:2024/05/16 13:05

建造者模式的主要特征是,通过一步一步的方式生成一些东西。每个生成的东西,即使其中的任何一步都不相同,但也将遵循同样的过程。

4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)

产品:需要创建的对象产品

建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用

具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配

指挥者:调用建造者抽象类以及其方法

代码:

 

// produce to be built

 

classStarbucks {

 

    privateString size;

 

    privateString drink;

 

  

 

    publicvoid setSize(String size) {

 

        this.size = size;

 

    }

 

  

 

    publicvoid setDrink(String drink) {

 

        this.drink = drink;

 

    }

 

}

 

  

 

//abstract builder

 

abstractclass StarbucksBuilder {

 

    protectedStarbucks starbucks;

 

  

 

    publicStarbucks getStarbucks() {

 

        returnstarbucks;

 

    }

 

  

 

    publicvoid createStarbucks() {

 

        starbucks = newStarbucks();

 

        System.out.println("a drink is created");

 

    }

 

  

 

    publicabstract void buildSize();

 

    publicabstract void buildDrink();

 

}

 

  

 

// Concrete Builder to build tea

 

classTeaBuilder extendsStarbucksBuilder {

 

    publicvoid buildSize() {

 

        starbucks.setSize("large");

 

        System.out.println("build large size");

 

    }

 

  

 

    publicvoid buildDrink() {

 

        starbucks.setDrink("tea");

 

        System.out.println("build tea");

 

    }

 

  

 

}

 

  

 

// Concrete builder to build coffee

 

classCoffeeBuilder extendsStarbucksBuilder {

 

    publicvoid buildSize() {

 

        starbucks.setSize("medium");

 

        System.out.println("build medium size");

 

    }

 

  

 

    publicvoid buildDrink() {

 

        starbucks.setDrink("coffee");

 

        System.out.println("build coffee");

 

    }

 

}

 

  

 

//director to encapsulate the builder

 

classWaiter {

 

    privateStarbucksBuilder starbucksBuilder;

 

  

 

    publicvoid setStarbucksBuilder(StarbucksBuilder builder) {

 

        starbucksBuilder = builder;

 

    }

 

  

 

    publicStarbucks getstarbucksDrink() {

 

        returnstarbucksBuilder.getStarbucks();

 

    }

 

  

 

    publicvoid constructStarbucks() {

 

        starbucksBuilder.createStarbucks();

 

        starbucksBuilder.buildDrink();

 

        starbucksBuilder.buildSize();

 

    }

 

}

 

  

 

//customer

 

publicclass Customer {

 

    publicstatic void main(String[] args) {

 

        Waiter waiter = newWaiter();

 

        StarbucksBuilder coffeeBuilder = newCoffeeBuilder();

 

  

 

        //Alternatively you can use tea builder to build a tea

 

        //StarbucksBuilder teaBuilder = new TeaBuilder();

 

  

 

        waiter.setStarbucksBuilder(coffeeBuilder);

 

        waiter.constructStarbucks();

 

  

 

        //get the drink built

 

        Starbucks drink = waiter.getstarbucksDrink();

 

  

 

    }

 

}

 

0 0
原创粉丝点击