zoukankan      html  css  js  c++  java
  • Java设计模式——建造者模式

       建造者模式(Builder Pattern)属于创建形的设计模式,使用多个简单的对象一步一步构建成一个复杂的对象。

    主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

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

    应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

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

    缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

    使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

    注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

    类图:

    代码:

    一、建立包装的接口

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

    二、建立菜单项的接口

    1 public interface Item {
    2   public String name();
    3   public Packing packing();
    4   public float price();
    5 }

    三、建立实现了包装接口的实体类

    1 public class Wrapper implements Packing {
    2 
    3     @Override
    4     public String pack() {
    5         return "Wrapper";
    6     }
    7 
    8 }
    1 public class Bottle implements Packing {
    2 
    3     @Override
    4     public String pack() {
    5         return "Buttle";
    6     }
    7 
    8 }

    四、建立实现菜单项接口的抽象类

    1 public abstract class Burger implements Item {
    2 
    3     @Override
    4     public Packing packing() {
    5         return new Wrapper();
    6     }
    7 }
    1 public abstract class ColdDrink implements Item {
    2 
    3     @Override
    4     public Packing packing() {
    5         return new Bottle();
    6     }
    7 }

    五、建立分别继承抽象类的实体类产品

     1 public class ChickenBurger extends Burger {
     2 
     3     @Override
     4     public String name() {
     5         return "ChickenBurger";
     6     }
     7 
     8     @Override
     9     public float price() {
    10         return 50.5f;
    11     }
    12 
    13 }
     1 public class VegBurger extends Burger {
     2 
     3     @Override
     4     public String name() {
     5         return "VegBurger";
     6     }
     7 
     8     @Override
     9     public float price() {
    10         return 25.0f;
    11     }
    12 
    13 }
     1 public class Coke extends ColdDrink {
     2 
     3     @Override
     4     public String name() {
     5         return "Coke";
     6     }
     7 
     8     @Override
     9     public float price() {
    10         return 30.0f;
    11     }
    12 
    13 }
     1 public class Pepsi extends ColdDrink {
     2 
     3     @Override
     4     public String name() {
     5         return "Pepsi";
     6     }
     7 
     8     @Override
     9     public float price() {
    10         return 35.0f;
    11     }
    12 
    13 }

    六、创建菜单类,提供点菜、算账、得到菜名的方法

     1 public class Meal {
     2    private List<Item> items = new ArrayList<Item>();
     3    
     4    public void addItems(Item item){
     5        items.add(item);
     6    }
     7    
     8    public float getCost(){
     9        float total = 0.0f;
    10        for (Item item : items) {
    11         total+=item.price();
    12     }
    13        return total;
    14    }
    15    
    16    public void showItems(){
    17        for (Item item : items) {
    18            System.out.print("Item : "+item.name());
    19            System.out.print(", Packing : "+item.packing().pack());
    20            System.out.println(", Price : "+item.price());
    21     }
    22    }
    23 }

    七、建立商品的组合类,负责创建菜单

     1 public class MealBuilder {
     2    public Meal prepareVegMeal(){
     3        Meal meal = new Meal();
     4        meal.addItems(new VegBurger());
     5        meal.addItems(new Coke());
     6        return meal;
     7    }
     8    
     9    public Meal prepareNonVegMeal(){
    10        Meal meal = new Meal();
    11        meal.addItems(new ChickenBurger());
    12        meal.addItems(new Pepsi());
    13        return meal;
    14    }
    15 }

    八、用户,可以选择不同的组合套餐

     1 public class BuiderPatternDemo {
     2 
     3     public static void main(String[] args) {
     4         MealBuilder mealBuilder = new MealBuilder();
     5         
     6         Meal meal1 = mealBuilder.prepareNonVegMeal();
     7         meal1.showItems();
     8         
     9         Meal meal2 = mealBuilder.prepareNonVegMeal();
    10         meal2.showItems();
    11     }
    12 
    13 }
  • 相关阅读:
    SpringCloud-Bus总线的其他应用场景(发布-订阅)
    Java的静态代理和动态代理
    为什么重写equals还要重写hashcode?(转载)
    js通过replace()方法配合正则去除空格
    2016-08-15T16:00:00.000Z 格式转换成yyyy-MM-dd HH:mm:ss格式
    js任意数组按下标相加
    学习笔记《Java多线程编程实战指南》四
    学习笔记《Java多线程编程实战指南》三
    学习笔记《Java多线程编程实战指南》二
    学习笔记《Java多线程编程实战指南》一
  • 原文地址:https://www.cnblogs.com/ccw95/p/5970849.html
Copyright © 2011-2022 走看看