dart设计模式之建造者模式

举报
坚果派 发表于 2021/08/07 07:30:44 2021/08/07
【摘要】 建造者模式模式分析建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。模式难点如何抽象出不同特性需要很强的抽象思维模式解决问题主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由...

建造者模式

模式分析

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

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

模式难点

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

模式解决问题

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

优点

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

缺点

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

模式应用场景

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

模式代码

//建造者模式
​
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("\n\nNon-Veg Meal");
    nonVegMeal.showItems();
    print("Total Cost: " + nonVegMeal.getCost().toString());
  }
}



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。