Abstract Factory

原创 2007年09月19日 10:59:00

 Object Factory用以生成一个对象,Abstract Factory用以生成多个关联的对象。

对于Abstract Factory而言,它有两个问题造成耦合度太高。一是Abstract Factory必须知道所有Abstruct Product,具体工厂必须知道它要生成的所有具体类。

Loki的AF解决了这个问题,在这里,我关心它如何做到的。

对于AF的抽象接口,Loki如此处理:

template    <class T>
class    AFUnit
...{
public:
    
virtual    T*    DoCreate(Type2Type<T>)    = 0;
    
virtual    ~AFUnit();
}
;

你可能需要生成好几个类,但这没有问题,GenScatterHierarchy可以把这个类应用于所有的TList成员类型。明显,不同的类有不同的DoCreate方法,为了获得正确的函数调用,这个Type2Type必不可少。

Loki使用了极具威力的TypeList传递待生成的类信息:

template
<
    
class    TList,
    template    
<class>    class    Unit    = AFUnit
>
class    AbstractFactory    :public GenscatterHierarchy<TList,Unit>
...{
public:
    typedef    TList    ProductList;
    template    
<class T>
    T
*    Create()
    
...{
        Unit
<T>&    unit    = *this;
        
return    unit.DoCreate(Type2Type<T>());
    }

}
;

好极了,GenscatterHierarchy可以把Unit应用于每个TList中的类型。对于特定的类型T,使用特定的Unit的Docreate方法生成。其实Create是一个分派器,对于特定的类型通过它你可以获得对应的产品。在这种情况下,你可以把AbstractFactory转型为某个具体类型工厂传递给特定的生成模块。

譬如T类型的文件只关心生成T,所以你可以传递AbstractFactory<T>,该文件所要做的只是实现T的DoCreate方法。

到此我们对这个框架有了大致的理解,但是还是没有说明如何实现DoCreate,其实解决方法比想像中的要简单。

template    <class ConcreteProduct,class Base>
class    OpNewFactoryUnit    :public    Base
...{
    typedef    typename    Base::ProductList    BaseProductList;
protected:
    typedef    typename    BaseProductList::Tail    ProductList;
public:
    typedef    typename    BaseProductList::Head    AbstractProduct;
    ConcreteProduct
*    DoCreate(Type2Type<AbstractProduct>)
    
...{
        
return    new    ConcreteProduct;
    }

}
;

如此所有产品都得到了DoCreate方法。但是有个问题,OpNewFactoryUnit的包含文件要知道所有的产品类。其实这不是问题,我们来看ConcretteFactory的实现再讨论这个问题:

template    <class AbstractFact,
            template 
<class,class,> class Creator = OpNewFactoryUnit
            
class TList = typename AbstractFact::ProductList
            
>
class ConcreteFactory
    :
public    GenLinearHierarchy<typename TL::Reverse<TList>::Result,Creator,AbstractFact>
...{
public:
    typedef    typename    AbstractFact::ProductList    ProductList;
    typedef    TList        ConcreteProductList;
}
;

首先一个问题,OpNewFactoryUnit在定义的时候不需要知道任何类,因为它只是操作模板参数,而它的使用地方是在ConcreteFactory中,这个时候一个参数就是TList,TList肯定知道需要的一切类,这个需要的代价就是文件包含。当然,OpNewFactoryUnit没有任何多于文件依赖。

上面代码也展示了具体工厂的实现。ConcreteFactory(最终)继承于AbstractFactory,所以获取产品的方法不会有任何修改。所以这里无需定义太多东西。而ConcreteFactory最后的继承于一个施加于OpNewFactoryUnit的TList作用的AbstractFactory。

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916...
  • u012515223
  • u012515223
  • 2014年05月26日 16:52
  • 2123

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月29日 02:25
  • 1660

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11279

对设计模式—Abstract Factory模式的认识

  • 2011年10月30日 10:08
  • 48KB
  • 下载

设计模式之Abstract Factory模式和代码实现

  • 2011年02月01日 01:12
  • 118KB
  • 下载

Abstract Factory

  • 2008年12月25日 18:23
  • 84KB
  • 下载

设计模式 创建型模式 Abstract Factory模式(抽象工厂)

  • 2012年12月19日 10:30
  • 1.81MB
  • 下载

抽象工厂模式(Abstract Factory).doc

  • 2013年03月22日 12:10
  • 845KB
  • 下载

C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

  • 2009年08月20日 15:43
  • 6.93MB
  • 下载

UIKit+Abstract-Factory

  • 2014年10月07日 08:13
  • 45KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Abstract Factory
举报原因:
原因补充:

(最多只允许输入30个字)