抽象工厂模式--GOF的23个之一

抽象工厂模式--GOF的23个之一


前言:来自《Head First 设计模式》,不涉及任何商务往来,仅为学习使用,作为参照笔记。抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

 

抽象工厂模式类图:

抽象工厂模式--GOF的23个之一

这个工厂将负责创建产品家族。


一、抽象工厂模式到底做了什么?

通过抽象工厂搜提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各种各样的工厂,制造出各种不同的产品。

例如:不同的区域、不同的操作系统、不同的外观及操作。


二、类图分为三部分理解

1、客户的代码中只需要设计抽象工厂,运行时将自动使用实际工厂。

2、工厂部分

(1)抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。

(2)这个具体工厂实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而不需实例化任何产品对象。

3、产品部分

产品家族,每个具体工厂都能够生产一整组的产品。

 

下面用实例来进行简单说明


实例源代码(http://download.csdn.net/detail/u011331844/6850899

名称(“抽象工厂模式实例代码”)


抽象工厂模式实例类图:

抽象工厂模式--GOF的23个之一

一、  所有的比萨都是使用相同的组件制造而成的,但是每个区域对于这些组件却有不同的实现。


二、  这个工厂将负责创建原料家族中的每一种原料。

产品差异、区域差异。

在接口中,每种原料都有一个对应的方法创建该原料。(这里有许多新类,每个原料都是一个类。)


三、  抽象工厂要做的事情是:

1、   为每一个区域创造一个工厂。你需要创建一个集成自PizzaIngredientFactory的子类来实现每一个创建方法。

2、   实现一组原料类提供工厂使用。例如ReggianoCheese、RedPeppers、ThickCrustDough。这些类可以在合适的区域间共享。

3、   然后仍然需要将这一切组织起来,将新的原料工厂整合进旧的PizzaStore代码中。 

为说明引入另外一张实例图:

抽象工厂模式--GOF的23个之一

四、  Pizza的prepare()方法外抽象工厂接口。

abstract void prepare();

在这个方法中,需要收集比萨所需的原料,而这些原料当然是来自原料工厂了。

五、  Pizza的代码利用相关的工厂生产原料。所生产的原料依赖使用的工厂,Pizza类根本不关心这些原料,它只知道如何制作比萨。现在,Pizza和区域原料之间被解耦,无论原料工厂是在北京还是上海,Pizza类都可以轻易地服用,完全没有问题。

六、  抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品时什么。这样一来,客户就从具体的产品中被解耦。




 

如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com

 

 

 

 

 

抽象工厂模式--GOF的23个之一

上一篇:和为S的连续正数序列


下一篇:研磨设计模式 之 代理模式(Proxy)1——跟着cc学设计系列