建造者模式


  • 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  • 建造者模式的用途,在于构建一个复杂对象–包含多种可替代的对象。例如:要提供人工智能服务,需要看得见听得到。而看得见,可以采用多家公司的图像识别,而不同的公司识别的某类可能更加准确;听得见,也可采用多种公司的语音识别,不同的公司可能在某个方向更加擅长。这样构建不同的智能服务则需要不同的搭配,但是提供的服务是一致的,这样通过建造者模式可更加简单的实现最优的智能服务提供。
    建造者模式
    建造者模式
    这里采用菜鸟教程的案例

创建一个表示食物条目和食物包装的接口。(相当于智能服务接口和语音或者服务的接口)

// 人工智能服务接口
public interface Item {
   public String name();
   public Packing packing();
   public float price();
}
// 组件服务的接口
public interface Packing {
   public String pack();
}

创建实现 Packing 接口的实体类。(相当于分辨语音识别和图像识别)

// 语音识别
public class Wrapper implements Packing {

   @Override
   public String pack() {
      return "Wrapper";
   }
}
// 图像识别
public class Bottle implements Packing {

   @Override
   public String pack() {
      return "Bottle";
   }
}

创建实现 Item 接口的抽象类,该类提供了默认的功能(相当于语音服务接口和视频服务接口)

// 语音服务接口
public abstract class Burger implements Item {

   @Override
   public Packing packing() {
      return new Wrapper();
   }

   @Override
   public abstract float price();
}
// 视频服务接口
public abstract class ColdDrink implements Item {

    @Override
    public Packing packing() {
       return new Bottle();
    }

    @Override
    public abstract float price();
}

创建扩展了 Burger 和 ColdDrink 的实体类。(相当于各个服务商的语音服务和图像服务)

// 例如腾讯语音
public class VegBurger extends Burger {

   @Override
   public float price() {
      return 25.0f;
   }

   @Override
   public String name() {
      return "Veg Burger";
   }
}
// 例如阿里语音
public class ChickenBurger extends Burger {

   @Override
   public float price() {
      return 50.5f;
   }

   @Override
   public String name() {
      return "Chicken Burger";
   }
}
// 例如阿里视频
public class Coke extends ColdDrink {

   @Override
   public float price() {
      return 30.0f;
   }

   @Override
   public String name() {
      return "Coke";
   }
}
// 例如腾讯视频
public class Pepsi extends ColdDrink {

   @Override
   public float price() {
      return 35.0f;
   }

   @Override
   public String name() {
      return "Pepsi";
   }
}

创建一个 Meal 类,带有上面定义的 Item 对象。(相当于构建智能服务)

public class Meal {
   private List items = new ArrayList();

   public void addItem(Item item){
      items.add(item);
   }

   public float getCost(){
      float cost = 0.0f;
      for (Item item : items) {
         cost += item.price();
      }
      return cost;
   }

   public void showItems(){
      for (Item item : items) {
         System.out.print("Item : "+item.name());
         System.out.print(", Packing : "+item.packing().pack());
         System.out.println(", Price : "+item.price());
      }
   }
}

创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。(相当构建不同特点的智能服务)

public class MealBuilder {

   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }

   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

总结

通过MealBuilder创建适合当前环境的服务智能对象,通过给Meal设置不同的语音和图像服务,而服务都实现了Item,可通过多态进行添加,可通过packing方法知道该对象是什么服务,可通过name知道服务的提供商。