(4)Java设计模式-建造者模式

  建造者模式(Builder):和工厂模式有点相似,不同的是工厂模式只负责单一对象的生产,建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。下面举个例子来研究建造者模式,我们假设一个快餐店一个典型的套餐可以是一个汉堡和一杯冷饮,也可以是多个汉堡,或者是不同味道的汉堡以及不同的冷饮。那么我们需要一个接口来描述商品,也就是汉堡或者是可乐。

1 //物品
2 public interface Thing {
3     public String name();// 商品名
4 
5     public Packing packing();// 商品包装方式
6 
7 }

  不管是汉堡还是可乐,都需要有包装方式。我们需要一个接口描述包装方式。

1 public interface Packing {
2     String pack();
3 }

  接下来我们需要实现包装方式的接口。为商品提供包装。

1 public class Wrapper implements Packing {
2 
3     @Override
4     public String pack() {
5         return "用盒子包装";
6     }
7 
8 }
1 public class Bottle implements Packing {
2 
3     @Override
4     public String pack() {
5         return "用瓶子包装";
6     }
7 
8 }

  有了包装方式,我们就需要产生商品

 1 //物品实现类
 2 public class HanBao implements Thing {
 3 
 4     @Override
 5     public String name() {
 6         return "麦香鸡腿堡";
 7     }
 8 
 9     @Override
10     public Packing packing() {
11         return new Wrapper();
12     }
13 
14 }
 1 //物品实现类
 2 public class KeLe implements Thing {
 3 
 4     @Override
 5     public String name() {
 6         // TODO Auto-generated method stub
 7         return "百事可乐";
 8     }
 9 
10     @Override
11     public Packing packing() {
12         // TODO Auto-generated method stub
13         return new Bottle();
14     }
15 
16 }

  我们把做好的商品放入餐盘。也就是上述的物品实现类组合成新的类。

 1 //餐盘
 2 public class Plate {
 3     private List<Thing> list = new ArrayList<Thing>();
 4 
 5     public void addThing(Thing thing) {
 6         list.add(thing);
 7     }
 8 
 9     public void showThing() {
10         for (Thing thing : list) {
11             System.out.println("包装方式:" + thing.packing().pack() + "  物品名称:" + thing.name());
12         }
13     }
14 }

  接下来就需要建造者来根据不同的需要生产出不同的套餐。

public class Buider {
    public Plate meal() {
        Plate plate = new Plate();
        plate.addThing(new HanBao());
        plate.addThing(new KeLe());
        return plate;
    }

    /**
     * ...省略一堆组合方式
     * 比如需要组成两个汉堡的组合
     * 两瓶可乐的组合
     * 几个汉堡加一瓶可乐的组合等等
     */
}

  测试类

1 public class test {
2     public static void main(String[] args) {
3         Buider buider = new Buider();
4         Plate plate = buider.meal();
5         plate.showThing();
6     }
7 }

  运行结果

包装方式:用盒子包装  物品名称:麦香鸡腿堡
包装方式:用瓶子包装  物品名称:百事可乐

 

posted @ 2017-03-24 13:55  祥哥37073  阅读(187)  评论(0)    收藏  举报