开头说几句
博主的博客地址: https://www.jeffcc.top/
博主学习设计模式用的书是 Head First 的《设计模式》,强烈推荐配套使用!
什么是抽象工厂模式
权威定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。
博主的理解:抽象工厂的任务就是定义一个负责创建一组产品的接口,接口的内部的每个方法都负责创建一个具体的产品,所以可以理解为抽象工厂就是多个工厂方法的高聚合的体现。
抽象工厂模式和工厂方法模式的比较
- 工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象;
- 抽象工厂使用的是对象组合,对象的创建被实现在工厂接口所暴露出来的方法中;
- 工厂方法允许类将实例化延迟到子类进行;
- 抽象工厂创建相关的对象家族,而不需要依赖他们的具体类;
设计原则
- 依赖倒置原则,要依赖抽象,不要依赖具体类,具体做法是需要高层组件(工厂)和底层组件(实现类)之间不要有太多的依赖关系,而是可以通过一个共同的抽象类(工厂产生的对象)来实现依赖倒置。
- 多用组合,少用继承。
- 针对接口编程,而不是针对实现编程。
- 为交互对象之间的松耦合设计而努力。
- 类应该对外开放拓展,对修改关闭。
设计实例
设计背景
利用上一篇博客讲到的 pizza 店为拓展,为了规范化加盟店,新加一个原料工厂,各个地区有自己不同的风格的原料,但是都必须遵守原料工厂所提供的的原料标准(接口规范化)
项目类图
项目结构
披萨工厂
ChicagoPizzaStore 加盟店
纽约 pizza 加盟店
Pizza 抽象类(关键)
ChicagoStyleCheesePizza 芝加哥风味
纽约风味 pizza
原料工厂(关键)
芝加哥的原料提供厂
纽约的原料提供厂
原料接口规范
不同地区的原料实现类
输出结果
PreparingNYStyleCheesePizza
Using Ingredient:
MozzarellaCheese
FreshClams
ThinCrustDough
pepperoni01
MarinaraSauce
Veggies01 Veggies03
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices!
Place pizza in official PizzaStore box
jay order a NYStyleCheesePizza
PreparingChicagoStyleCheesePizza
Using Ingredient:
ReggianoCheese
FrozenClams
ThickCrustDough
pepperoni02
PlumTomatpSauce
Veggies02 Veggies03
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
jeff order a NYStyleCheesePizza
回归定义
我们之前定义说的抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。
在这个具体的实例中都有着对应的关系。
PizzaIngredientFactory 提供了一个接口,里面有着一个原料家族的创建的关系,并且这个 PizzaIngredientFactory 类并没有指定任何的具体的类;
而我们也很容易看出,如果把原料分离开来单独写,那么就是一个一个的小工厂,所以说抽象工厂模式其实通俗来说就是一个大工厂里面有好多个小工厂!
END
2019 年 9 月 5 日 10:05:54
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于