// // // // // // // // //
///2013.1.14
// // // // // // // // //
今天我们要继续讲Factory的衍生模式,
——AbstractFactory模式。
【核心】将Factory抽象(有点……废话)。
还是先来看一下UML图:
其实这个衍生官方并没有明确说这个词,
只是按照我的认识去理解的。
它与Factory最大的区别在于:
如果Factory是一个生产不同产品的工厂的话,
那AbstractFactory就是生产不同品牌的产品的工厂的抽象。
简而言之,
Factory是抽象了产品,
AbstractFactory是抽象了工厂。
一般而言,
一般编程者比较少使用Factory模式,
代之的是使用AbstractFactory模式,
原因很简单,
抽象一个产品,与抽象一个生产不同产品的工厂相比,
后者更为实用。
我们继续上一个例子,
同样是生产iPhone5sMini与iPodTouchLarge的两个厂商:
正牌厂商蘋果公司与山寨厂商苹果公司都会生产这两个产品,
产品种类相同,但是质量不同,
自然就会想到他们都有一个母公司叫做X果公司,
那么这个X果公司就是他们的抽象工厂了。
// // // // // // // // //
///2013.1.15
// // // // // // // // //
下面我们给出AbstractFactory模式的实例代码。p.s.为方便理解,只是使用了一个产品(iPhone),但是这是可以无限增加的,只要Factory需要就Ok。
Product.h
#ifndef _PRODUCT_H_ #define _PRODUCT_H_ class IPhone5 { public: IPhone5(){} ~IPhone5(){} }; class MadeByApple: public IPhone5 { public: MadeByApple(); }; class MadeByEpple:public IPhone5 { public: MadeByEpple(); }; #endif
#include "Product.h" #include<iostream> MadeByApple::MadeByApple() { std::cout<<"Produced an Apple iPhone"<<std::endl; } MadeByEpple::MadeByEpple() { std::cout<<"Produced an Epple iPhone"<<std::endl; }
#ifndef _FACTORY_H_ #define _FACTORY_H_ class IPhone5; enum { Apple, Epple }; class Factory { public: virtual IPhone5* create()=0; protected: ~Factory(){} Factory(){} }; class AppleFactory:public Factory { public: IPhone5* create(); AppleFactory(){} }; class EppleFactory:public Factory { public: IPhone5* create(); EppleFactory(){} }; #endif
#include "Factory.h" #include "Product.h" IPhone5* AppleFactory::create() { return new MadeByApple(); } IPhone5* EppleFactory::create() { return new MadeByEpple(); }
#include"Factory.h" #include"Product.h" int main(int argc,char* argv[]) { Factory* factory[2]; IPhone5* iPhone5; factory[Apple] = new AppleFactory(); factory[Epple] = new EppleFactory(); iPhone5 = factory[Apple]->create(); iPhone5 = factory[Epple]->create(); return 0; }