由AF再论template

原创 2007年09月19日 13:38:00

template的伟大魅力在于它的自动生成代码能力,基于template的技术,无论多么高深仰或多么花哨,只要你明白它的自动生成代码的本质,问题会好处理很多。

譬如AbstractFactory在template下的loki做法,它只是为了让编译器帮我们生成代码而已,如果你考虑手写代码,问题会好理解很多。

A抽象基类问题

如果你要使用AbstractFactory模式,那你首先要有一个基类,它定义了生成方法。Loki定义了如此一个接口:

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

这是一个模板化的东西,明显,在不同的类参与作用下,这会被实例化出一系列类,这是与AF有悖的,毕竟AF我们希望使用统一一个基类,为了支持到这一点,Loki使用了强大的外星动力:GenScatterHierarchy。如此我们得到了一个统一的唯一的接口:

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

}
;

尽管这个AbstractFactory是一个多类的组合体,只是它可以作为一个类使用处理,但这不仅仅保证了一个唯一的基类,还给我们提供了额外的优势——细粒度化,你可以对不同的模块传递它的不同颗粒,本模块不必知晓任何一点与自己无关的颗粒以及与该颗粒管理的类、包含关系。

我们回顾AF模式,它要求基类只需要提供统一接口。ok,这个AbstractFactory已经满足这个要求了。使用AF的时候抽象基类问题到此得到完美解决。

B子类实现问题

AF有几个要求,子类要继承基类,并且实现基类的方法,子类也应该是一个唯一的类。

基类已经是一个多颗粒的东西,子类必然是多颗粒的,单又要都继承于AbstractorFactory而且又要保证自己的外观是单颗粒的,只有逐一继承最后包装,GenLinearHierarchy可以帮上这个忙,它可以产出都继承于某一类的类(如果你习惯使用loki的时候使用默认参数,我建议你要多全部参数的声明有个了解),而且它可以对TList操作,不要忘记,AbstractFactory也使用了TList,使用同样的TList可以使你得到完美的继承体系。

满足了继承关系,还要重写基类的虚函数,使用policy是个不错的选择,为继承体系中的每个类都加入一个实现了虚函数的policy,这样每个类都有了虚函数的实现,而每个类又恰恰继承于基类,这简直太完美了,巧合还是人为?难以一言蔽之。

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;
}
;

使用TL和Creator创建继承于AbstractFact的线性类表,而ConcreteFactory继承于这个线性表,或者可以说ConcreteFactory是对多颗粒的一个单粒度封装。还是太完美了。

到这里实现Creator规则太简单了。

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;
    }

}
;

Creator没有什么特别的,按照指定规则做事而已。

到这里AF已经被Loki包装成完全自动生成代码的东西了,你只需提供少量的信息,就可以批量获取产品,这才是工厂。

    typedef    AbstractFactory<LOKI_TYPELIST_3(Base,Test1,Test2)>    MyKit;
    
//MyKit*    pKit    = new    MyKit;
    
//Test2*    t2    = pKit->Create<Test2>();

    typedef    ConcreteFactory
<MyKit>    MyConKit;

    MyConKit
*    pKit    = new    MyConKit;
    SmartPtr
<Test2>    t2    = pKit->Create<Test2>();
    t2
->say();
    SmartPtr
<Test1>    t3    = pKit->Create<Test1>();
    t3
->say();

不管如何美化,template还是为了生成代码,这是它的本质,用这个本质考虑template参与情况下的问题会容易理解很多。分析使用AF的时候的逐个细节并归纳,你也可以完成这些。

硬盘安装助手安装苹果Mac系统镜像Change partition type to AF: not a HFS partition的解决方法

请严格按照如下流程: 1 以管理员打开 硬盘安装助手 2 选择苹果Mac系统镜像 (cdr格式的) 3 直接选择要写入的盘,不要点击右边的方框中的勾选 (此时就可以写入了,虽然最后还是显示 Chang...
  • wletv
  • wletv
  • 2015年11月07日 11:05
  • 18036

af

抽象工厂 好处:使得切换(创建)不同系列对象变的容易。 缺点:难于扩展,要扩展必须从抽象层变化。 代码 package:designparttern.abstr...
  • pltc325
  • pltc325
  • 2014年04月21日 14:40
  • 215

Mac下挂载EFI分区

Mac下挂载EFI分区 转自 http://hi.baidu.com/skykiri/item/5ec6a3a8786dcd2c8819d36b 1. Discover th...
  • skykingf
  • skykingf
  • 2013年10月25日 14:35
  • 66540

Mac OS X Snow Leopard 10.6下载及安装

http://hi.baidu.com/hualeo/blog/item/86cf597eed7829340dd7da85.html Mac OS X Snow Leopard 10.6下载及安装 h...
  • frank2336
  • frank2336
  • 2011年02月16日 23:38
  • 14532

由AF再论template的再考虑

AF模式运行使用任何实现方法,只要AbstractFactory被完全实现。那开发一个原型产品工厂完全不用修改底层的东西。使用template的本质论。如果我们开发原型工厂,那在new对象的时候要换成...
  • win2ks
  • win2ks
  • 2007年09月19日 13:56
  • 553

再论由内而外造就自己

再论由内而外造就自己
  • Last_Impression
  • Last_Impression
  • 2015年06月14日 18:39
  • 929

jsPDFEditor js代码

/** * jsPDFEditor * @return {[type]} [description] */ var jsPDFEditor = function() { var editor...
  • qq1099866969
  • qq1099866969
  • 2015年09月22日 15:15
  • 5132

精通比特币-第4章 密钥、地址、钱包

4.1 简介 比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。存储在用户钱包中的数字密钥完全独...
  • AMDS123
  • AMDS123
  • 2017年06月20日 00:48
  • 3597

笔记:《高效能人士的七个习惯》第十一章 再论由内而外造就自己

1、 七个习惯浇灌出来的最高级、最美好和最甘甜的果实就是齐心协力,就是把自己、爱人、朋友和同事合而为一。 2、 刺激与回应之间存在一段距离,成长和幸福的关键就在于我们如何利用这段距离。 3、 我们...
  • icamera0
  • icamera0
  • 2016年01月21日 23:14
  • 1029

有一种渣,叫做由内而外的渣,就是我

之前大三的时候校招拿过百度offer,后来实习也是随便面了一下进入了一个小公司实习,于是自己作死的自信心暴涨,然后就各种研一不上进,结果现在跪成狗。 其实早在大四时候面过百度某部门的研发实习生,对方...
  • geniusluzh
  • geniusluzh
  • 2014年04月01日 07:41
  • 811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由AF再论template
举报原因:
原因补充:

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