抽象工厂模式--GOF的23个之一
前言:来自《Head First 设计模式》,不涉及任何商务往来,仅为学习使用,作为参照笔记。抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂模式类图:
这个工厂将负责创建产品家族。
一、抽象工厂模式到底做了什么?
通过抽象工厂搜提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各种各样的工厂,制造出各种不同的产品。
例如:不同的区域、不同的操作系统、不同的外观及操作。
二、类图分为三部分理解
1、客户的代码中只需要设计抽象工厂,运行时将自动使用实际工厂。
2、工厂部分
(1)抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
(2)这个具体工厂实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而不需实例化任何产品对象。
3、产品部分
产品家族,每个具体工厂都能够生产一整组的产品。
下面用实例来进行简单说明
实例源代码(http://download.csdn.net/detail/u011331844/6850899)
名称(“抽象工厂模式实例代码”)
抽象工厂模式实例类图:
一、 所有的比萨都是使用相同的组件制造而成的,但是每个区域对于这些组件却有不同的实现。
二、 这个工厂将负责创建原料家族中的每一种原料。
产品差异、区域差异。
在接口中,每种原料都有一个对应的方法创建该原料。(这里有许多新类,每个原料都是一个类。)
三、 抽象工厂要做的事情是:
1、 为每一个区域创造一个工厂。你需要创建一个集成自PizzaIngredientFactory的子类来实现每一个创建方法。
2、 实现一组原料类提供工厂使用。例如ReggianoCheese、RedPeppers、ThickCrustDough。这些类可以在合适的区域间共享。
3、 然后仍然需要将这一切组织起来,将新的原料工厂整合进旧的PizzaStore代码中。
为说明引入另外一张实例图:
四、 Pizza的prepare()方法外抽象工厂接口。
abstract void prepare();
在这个方法中,需要收集比萨所需的原料,而这些原料当然是来自原料工厂了。
五、 Pizza的代码利用相关的工厂生产原料。所生产的原料依赖使用的工厂,Pizza类根本不关心这些原料,它只知道如何制作比萨。现在,Pizza和区域原料之间被解耦,无论原料工厂是在北京还是上海,Pizza类都可以轻易地服用,完全没有问题。
六、 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品时什么。这样一来,客户就从具体的产品中被解耦。
如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com