23种设计模式之-建造者模式

来源:互联网 发布:php环境变量怎么配置 编辑:程序博客网 时间:2024/05/16 16:04

什么是建造者模式

使用多个简单的对象一步一步构建成一个复杂的对象

有什么特点

1、建造者独立,易扩展。 2、便于控制细节风险。

什么时候使用

一些基本部件不会变,而其组合经常变化的时候。

如何使用

举例:我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

package com.exe.builder.entity;public interface Item {     public String name();     public float price();     public Packing packing();}
package com.exe.builder.entity;public interface Packing {    public String pack();    public float price();}
package com.exe.builder.entity;public class Bottle  implements Packing {       @Override       public String pack() {          return "Bottle";       }    @Override    public float price() {        return 0.5f;    }}
package com.exe.builder.entity;public class Wrapper implements Packing {       @Override       public String pack() {          return "Wrapper";       }    @Override    public float price() {        return 0.2f;    }}
package com.exe.builder.entity;public abstract class Burger implements Item {    @Override    public Packing packing() {         return new Wrapper();    }}
package com.exe.builder.entity;public class ChickenBurger extends Burger {    @Override    public String name() {        return "ChickenBurger";    }    @Override    public float price() {        return 20f;    }}
package com.exe.builder.entity;public class Coke extends ColdDrink {    @Override    public String name() {        return "Coke";    }    @Override    public float price() {        return 3.0f;    }}
package com.exe.builder.entity;public  abstract class ColdDrink implements Item {    @Override    public Packing packing() {         return new Bottle();    }}
package com.exe.builder.entity;public class VegBurger extends Burger {    @Override    public String name() {        return "VegBurger";    }    @Override    public float price() {        return 15f;    }}
package com.exe.builder.entity;public class Pepsi extends ColdDrink {    @Override    public String name() {        return "Pepsi";    }    @Override    public float price() {        return 1.5f;    }}
package com.exe.builder.entity;import java.util.ArrayList;import java.util.List;public class Menu {    private List<Item>items=new ArrayList<Item>();    public void addItem(Item item){        items.add(item);    }    public float getCost(){        float cost=0f;        for(Item item:items){            cost=cost+item.price()+item.packing().price();        }        return cost;    }    public void showMenu(){        for(Item item:items){            System.out.print(item.name());            System.out.print(":");            System.out.print(item.price());            System.out.print(":");            System.out.print(item.packing().pack());            System.out.print(":");            System.out.println(item.packing().price());        }    }}
package com.exe.builder.entity;public class BuildMenu {    public Menu meal1(){        Menu menu=new Menu();        menu.addItem(new ChickenBurger());        menu.addItem(new Pepsi());        return menu;    }    public Menu meal2(){        Menu menu=new Menu();        menu.addItem(new VegBurger());        menu.addItem(new Coke());        return menu;    }}
package com.exe.builder.entity;public class Test {    public static void main(String[] args) {        BuildMenu buildMenu=new BuildMenu();        Menu menu=buildMenu.meal1();        menu.showMenu();        System.out.println(menu.getCost());        System.out.println("============");        menu=buildMenu.meal2();        menu.showMenu();        System.out.println(menu.getCost());    }}
原创粉丝点击