设计模式---抽象工厂

来源:互联网 发布:php源码解密 编辑:程序博客网 时间:2024/05/16 18:40



Abstract Factory

一、功能

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二、示例代码

namespace DesignPattern_AbstractFactory{class AbstractProductA {};// Product Aclass ProductA1 : public AbstractProductA {};class ProductA2 : public AbstractProductA {};class AbstractProductB {};// Product Bclass ProductB1 : public AbstractProductB {};class ProductB2 : public AbstractProductB {};class AbstractFactory{public:virtual AbstractProductA* CreateProductA() = 0 ;// 创建ProductAvirtual AbstractProductB* CreateProductB() = 0 ;// 创建ProductB} ;class ConcreteFactory1 : public AbstractFactory{public:virtual AbstractProductA* CreateProductA() { return new ProductA1() ; }virtual AbstractProductB* CreateProductB() { return new ProductB1() ; }static ConcreteFactory1* Instance() { static ConcreteFactory1 instance ; return &instance ; }protected:ConcreteFactory1() {}private:ConcreteFactory1(const ConcreteFactory1&) ;ConcreteFactory1& operator=(const ConcreteFactory1&) ;} ;class ConcreteFactory2 : public AbstractFactory{public:virtual AbstractProductA* CreateProductA() { return new ProductA2() ; }virtual AbstractProductB* CreateProductB() { return new ProductB2() ; }static ConcreteFactory2* Instance() { static ConcreteFactory2 instance ; return &instance ; }protected:ConcreteFactory2() {}private:ConcreteFactory2(const ConcreteFactory2&) ;ConcreteFactory2& operator=(const ConcreteFactory2&) ;} ;}客户端代码:{using namespace DesignPattern_AbstractFactory ;// 第一种创建方法AbstractFactory *pFactory = ConcreteFactory1::Instance() ;AbstractProductA *pProductA = pFactory->CreateProductA() ;AbstractProductB *pProductB = pFactory->CreateProductB() ;// 第二种创建方法pFactory = ConcreteFactory2::Instance() ;pProductA = pFactory->CreateProductA() ;pProductB = pFactory->CreateProductB() ;}
用通俗的话,解释一遍“功能:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。”用例子解说,在上面的客户端代码示例中,
我们原本要创建 ProductA1, ProductB1, ProductA2,ProductB2,四个对象,如果使用抽象工厂模式,首先,我们要提取一个抽象工厂类,就是
class AbstractFactory{public:virtual AbstractProductA* CreateProductA() = 0 ;// 创建ProductAvirtual AbstractProductB* CreateProductB() = 0 ;// 创建ProductB} ;
并在 AbstracFactory的具体子类中实现具体对象的创建过程,如:class AbstractFactory1, class AbstractFactory2.在客户代码中,我们使用统一的对象创建过程:
pProductA = pFactory->CreateProductA() ;pProductB = pFactory->CreateProductB() ;
创建对象。
客户代码不需要关心那4个具体对象的类。
优点:客户代码逻辑单一,指需要使用特定的具体子类,如,AbstractFactory1 的对象来创建其子对象。而不需要知道ProductA1,ProductB1类。
缺点:当新增一个具体对象类,如ProductC1时,要在抽象工厂类中新增抽象的创建方法,并在各个具体实现子类中增加。
原创粉丝点击