您的位置:首页 > 其它

工厂模式 用法 补充 & 与抽象工厂区别

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 部分又增加了一层,把工厂也做了一次抽象。

一般,一个工厂生产的产品,如果类型很简单(如:面包店,生成不同种类的面包),则只需要一个工厂(面包工厂),就可以了



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();
           ....
    }
}




呵呵,现在,已经绝对的是:一个工厂上面再加一个工厂了!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐