工厂模式 用法 补充 & 与抽象工厂区别
2010-02-26 14:10
393 查看
在WIKI中重新看了一下抽象工厂模式(http://en.wikipedia.org/wiki/Abstract_factory),其中有一句关于 工厂 的信息特别有重要:
In software development, a Factory is the location in the code at which objects are constructed. The intent in employing the pattern is to insulate the creation of objects from their usage. This allows for new derived types to be introduced with no change to the code that uses the base class.
再次强调下 工厂 的相关信息:
1。工厂用于生成实例
工厂可以生成多种多样的实例了,具体生成什么实例,调用方不需要知道(调用方不就是为了这个效果吗?!效果是什么?代码隔离,减少复杂度)
2。调用方代码与实例生成代码 隔离
我个人的理解,这里的隔离最终还是为了第一点:不需要考虑生成什么实例了。不隔离怎么保证生成实例对调用方透明呢?!
这一点在我以前的BLOG有说明。
3。虽然是不同的实例返回,但调用方不需要为此作更改。
通过继承,虚拟的方式实现这一功能
所以,当你准备使用工厂模式时,可以拿这三点对照一下。
抽象工厂模式与工厂模式有什么不同,先看看UML图
Abstract Factory:
从UML图看,它从Factory要复杂的多,一般的工厂模式UML图如下:
抽象工厂在上图的 FactoryCreator 部分又增加了一层,把工厂也做了一次抽象。
一般,一个工厂生产的产品,如果类型很简单(如:面包店,生成不同种类的面包),则只需要一个工厂(面包工厂),就可以了
而抽象工厂的模式要解决: 当工厂也存在许多不同的种类时 一种方法。
如上面的例子,现在我们要增加不同的面包生厂工厂,就变为如下:
所以,抽象工厂其实只是工厂模式的一个增强,可以理解为:在一个简单工厂模式上面再加一个工厂模式。如上面的例子,如果,在全国各地都有工厂,那就需要再加一个工厂了:
呵呵,现在,已经绝对的是:一个工厂上面再加一个工厂了!!
In software development, a Factory is the location in the code at which objects are constructed. The intent in employing the pattern is to insulate the creation of objects from their usage. This allows for new derived types to be introduced with no change to the code that uses the base class.
再次强调下 工厂 的相关信息:
1。工厂用于生成实例
工厂可以生成多种多样的实例了,具体生成什么实例,调用方不需要知道(调用方不就是为了这个效果吗?!效果是什么?代码隔离,减少复杂度)
2。调用方代码与实例生成代码 隔离
我个人的理解,这里的隔离最终还是为了第一点:不需要考虑生成什么实例了。不隔离怎么保证生成实例对调用方透明呢?!
这一点在我以前的BLOG有说明。
3。虽然是不同的实例返回,但调用方不需要为此作更改。
通过继承,虚拟的方式实现这一功能
所以,当你准备使用工厂模式时,可以拿这三点对照一下。
抽象工厂模式与工厂模式有什么不同,先看看UML图
Abstract Factory:
从UML图看,它从Factory要复杂的多,一般的工厂模式UML图如下:
抽象工厂在上图的 FactoryCreator 部分又增加了一层,把工厂也做了一次抽象。
一般,一个工厂生产的产品,如果类型很简单(如:面包店,生成不同种类的面包),则只需要一个工厂(面包工厂),就可以了
class BreadFactory { Bread CreateBread( enum BreadType type ); } Interface Bread { } class BreadA : Bread {} class BreadB : Bread {} ...
而抽象工厂的模式要解决: 当工厂也存在许多不同的种类时 一种方法。
如上面的例子,现在我们要增加不同的面包生厂工厂,就变为如下:
interface BreadFactory { Bread CreateBread( enum BreadType type ); } class BeiJinBreadFactory { Bread CreateBread( enum BreadType type ); } class ShangHaiBreadFactory { Bread CreateBread( enum BreadType type ); } Interface Bread { } class BreadA : Bread {} class BreadB : Bread {} ...
所以,抽象工厂其实只是工厂模式的一个增强,可以理解为:在一个简单工厂模式上面再加一个工厂模式。如上面的例子,如果,在全国各地都有工厂,那就需要再加一个工厂了:
class AreaFactory { BreadFactory CreateFactoryByArea( string strName ) { if( strName == "BeiJin" ) return BeiJinBreadFactory(); else if( strName == "ShangHai" ) return ShangHaiBreadFactory(); .... } }
呵呵,现在,已经绝对的是:一个工厂上面再加一个工厂了!!
相关文章推荐
- Android invalidate & postInvalidate的区别与用法
- [DIV/CSS] CSS 属性 :before && :after的用法,伪类和伪元素的区别
- "background-color"和"bgColor"用法上区别
- Eval( " ")和DataBinder.Eval(Container.DataItem, " ")的区别及用法
- 【转载】一些数据格式化-Eval( " ")和DataBinder.Eval(Container.DataItem, " ")的区别及用法&DataFormatString使用笔记
- <input type="image"> 和 <img> 用法区别
- <Android>设计模式的工厂模式(待补充)
- C# IList, ArrayList与List的区别详解 & 简单用法举例
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- C语言中char*和char[]用法区别分析&微软编译器的坑
- asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
- 计算机基础--java中<< >> >>>的区别用法
- &和&&,|和||的用法区别
- asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
- __weak & __unsafe_unretained的用法以及区别
- asp.net <%%> <%#%><%=%><%@%><%$%>用法区别
- typedef和#define的用法与区别&nbs…
- asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
- OC .(点)与->(箭头)用法区别
- HTML&CSS——Position属性四个值:fixed、absolute和relative的区别和用法