• 建造者模式


    定义:建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,修改时只需要修改其中相应的一小部分,避免牵一发而动全身。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    角色:

    1.AbstractBuilder:抽象建造者
          为创建一个Product对象的各个部件指定抽象接口,将建造的具体过程交与它的子类来实现。一般会有两部分抽象方法,一部分用来建造产品,一个是用来返回产品。如下图,buildPart1和buildPart2用来构造产品,retrieveResult返回产品。
     2.ConcreteBuilder:具体建造者
         实现抽象建造者的抽象方法,之所以这样,是为了便于不同情况下的扩充。
     3.Director:导演者
          负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
     4.Product:产品类
          表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
    结构图:

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

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

    应用:以下案例示范将一餐饭(product)拆解为每份食物、包装,更改单个食物的属性不需要修改这餐饭。
    1.创建一个表示食物条目和食物包装的接口。

    public interface Item
    {
    public String name(); public Packing packing(); public float price(); }
    public interface Packing
    {
      public String pack();
    }

    2.创建实现 Packing 接口的实体类。

    public class Wrapper implements Packing 
    {
       public String pack() {   return "Wrapper";}
    }
    
    public class Bottle implements Packing 
    {
       public String pack() { return "Bottle";}
    }

    3.创建实现 Item 接口的抽象类,该类提供了默认的功能。

    public abstract class Burger : Item 
    {
       public Packing packing() { return new Wrapper();  }
       public abstract float price();
    }
    
    public abstract class ColdDrink : Item 
    {
        public Packing packing() { return new Bottle();}
        public abstract float price();
    }

    4.创建扩展了 Burger 和 ColdDrink 的实体类。

    public class VegBurger extends Burger 
    {
       public float price() { return 25.0f; }
       public String name() { return "Veg Burger"; }
    }
    
    public class ChickenBurger extends Burger 
    {
       public float price() { return 50.5f; }
       public String name() { return "Chicken Burger";}
    }
    public class Coke extends ColdDrink 
    {
       public float price() {  return 30.0f;}
       public String name() { return "Coke";}
    }
    
    public class Pepsi extends ColdDrink 
    {
       public float price() {return 35.0f; }
       public String name() { return "Pepsi";}
    }

    5.建一个 Meal 类,带有上面定义的 Item 对象,类似定义一餐所包含的类目。

    public class Meal 
    {
       private List<Item> items = new ArrayList<Item>();
       public void addItem(Item item){  items.add(item); }
    
       public float getCost()
        {
          float cost = 0.0f;
          for (Item item : items) {  cost += item.price(); }
          return cost;
       }
    }

    5.使用:

    Meal meal = new Meal();
    meal.addItem(new VegBurger());
    meal.addItem(new Coke());
    meal.getcost()获取消费
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    BZOJ 1207
    Poj 2096 Collecting Bugs (概率DP求期望)
    HDU 5159 Card (概率求期望)
    HDU 4649 Professor Tian (概率DP)
    HDU 4652 Dice (概率DP)
    HDU5001 Walk(概率DP)
    C++中的 Round(),floor(),ceil()
    HDU 5245 Joyful(概率题求期望)
    poj 3071 Football (概率DP水题)
    关于一个群号分解的最大质数的求法
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8313239.html
Copyright © 2020-2023  润新知