dart设计模式之建造者模式

2021-08-06 11:14:56 浏览数 (1)

建造者模式

模式分析

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

模式难点

如何抽象出不同特性需要很强的抽象思维

模式解决问题

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

优点

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

缺点

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

模式应用场景

  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。

模式代码

代码语言:javascript复制
//建造者模式
​
import 'run.dart';
​
//建造者模式的精髓在于抽象,要把内容都抽象成一个一个的类来实现
//标识食物的接口
abstract class Item {
  String name;
  Packing packing();
  double price;
}
​
//包装接口
abstract class Packing {
  String pack();
}
​
//实现包装接口的实体类
class Wrapper implements Packing {
  @override
  pack() {
    return "Wrapper";
  }
}
​
class Bottle implements Packing {
  @override
  String pack() {
    return "Bottle";
  }
}
​
///创建实现Item接口的抽象类
//使用包装纸包装的食物
abstract class Burger implements Item {
  @override
  Packing packing() {
    return new Wrapper();
  }
}
//使用瓶子包装的食物
abstract class ColdDrink implements Item {
  @override
  Packing packing() {
    return new Bottle();
  }
}
​
//创建扩展了Burger和ColdDrink的实体类
//蔬菜
class VegBurger extends Burger {
  @override
  String name = "Veg Burger";
​
  @override
  double price = 34.3;
}
​
//鸡肉汉堡包
class ChickenBurger extends Burger {
  @override
  String name = "Chicken Burger";
  @override
  double price = 56.2;
}
​
//可乐
class Coke extends ColdDrink {
  @override
  String name = "Coke";
  @override
  double price = 3;
}
​
//百事
class Pepsi extends ColdDrink {
  @override
  String name = "Pepsi";
  @override
  double price = 4;
}
​
//创建Meal类用于打印实例化的对象信息
class Meal {
  List<Item> _items = [];
  void addItem(Item item) => _items.add(item);
  //计算所有项目的总价
  double getCost() {
    double cost = 0;
    for (var item in _items) {
      cost  = item.price;
    }
    return cost;
  }
​
  //展示当前项目
  showItems() {
    for (var item in _items) {
      print("item:"  
          item.name  
          ", Packing: "  
          item.packing().pack()  
          ", Price:"  
          item.price.toString());
    }
  }
}
​
class MealBuilder {
  Meal prepareVegMeal() {
    Meal meal = new Meal();
    meal.addItem(new VegBurger());
    meal.addItem(new Coke());
    return meal;
  }
​
  Meal prepareNonVegMeal() {
    Meal meal = new Meal();
    meal.addItem(new ChickenBurger());
    meal.addItem(new Pepsi());
    return meal;
  }
}
​
class RunBuilderPattern implements Run {
  @override
  main() {
    print('建造者模式创建');
    MealBuilder mealBuilder = new MealBuilder();
    Meal vegMeal = mealBuilder.prepareVegMeal();
    print("Veg Meal");
    vegMeal.showItems();
    print("Total Cost: "   vegMeal.getCost().toString());
​
    Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
    print("nnNon-Veg Meal");
    nonVegMeal.showItems();
    print("Total Cost: "   nonVegMeal.getCost().toString());
  }
}

0 人点赞