抽象工厂模式(Abstract Factory)

来源:互联网 发布:小象学院算法视频 编辑:程序博客网 时间:2024/06/06 18:39
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:
(1)封装创建过程。客户不用知道类厂是如何创建类实例的,类厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 
(2)将客户与具体类隔离,提高了各自的可重用性。 
缺点:Factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。

Abstract Factory类中通常是一组Factory Method的集合。Factory Method模式没有本质区别。通常可以把工厂作为单件。


#include <vcl.h>class AbstractProductA{};//抽象产品A(模拟仪表家族)class ProductA1:public AbstractProductA//具体产品A1{    public:    ProductA1()    {      MessageBox(0,"模拟仪表,xk3190A9","产品A1",0);    }};class ProductA2:public AbstractProductA//具体产品A2{    public:    ProductA2()    {      MessageBox(0,"模拟仪表,xk3190A9+","产品A2",0);    }};class AbstractProductB{};//抽象产品B(数字仪表家族)class ProductB1:public AbstractProductB //具体产品B1{    public:    weProductB1()    {      MessageBox(0,"数字仪表,DS1","产品B1",0);    }};class ProductB2:public AbstractProductB//具体产品B2{    public:    weProductB2()    {       MessageBox(0,"数字仪表,DS3","产品B2",0);    }};//-------------------------------------------------------------------------class AbstractFactory //抽象工厂{    public:       virtual AbstractProductA * CtreateProductA()=0;//生产模拟仪表       virtual AbstractProductB * CtreateProductB()=0;//生产数字仪表};//具体工厂1class ConCreateFactory1:public AbstractFactory{   public:    virtual AbstractProductA * CtreateProductA()//生产A9仪表    {        return new ProductA1();    }    virtual AbstractProductB * CtreateProductB()//生产DS3    {        ProductB2 * a = new ProductB2();        a->weProductB2();    }    static ConCreateFactory1 * Instance()//单件模式    {       static ConCreateFactory1 factory1;       return &factory1;    }   protected:     ConCreateFactory1(){};     ConCreateFactory1(const ConCreateFactory1&);     ConCreateFactory1 & operator =(const ConCreateFactory1 &);};//具体工厂2class ConCreateFactory2:public AbstractFactory{   public:    virtual AbstractProductA * CtreateProductA()//生产A9+    {      return new ProductA2();    }    virtual AbstractProductB * CtreateProductB()//生产DS1    {       ProductB1 * b= new ProductB1();       b->weProductB1();    }    static ConCreateFactory2 * Instance()//单件模式    {       static ConCreateFactory2 factory2;       return &factory2;    }   protected:     ConCreateFactory2(){};     ConCreateFactory2(const ConCreateFactory2&);     ConCreateFactory2 & operator =(const ConCreateFactory2 &);};

.cpp中调用方法,如下:

void __fastcall TForm1::Button13Click(TObject *Sender){    ConCreateFactory1 *f = ConCreateFactory1::Instance();//A9,DS1    AbstractProductA *p = f->CtreateProductA();    f->CtreateProductB();    ConCreateFactory2 *f1=  ConCreateFactory2::Instance();//A9+,DS3    f1->CtreateProductA();    f1->CtreateProductB();}


0 0
原创粉丝点击