设计模式之 工厂模式 及 c++ 实现

      抽象工厂是为创建一组相关或依赖的对象提供接口,使得一组对象的维护,只需要维护相应的创建对象的工厂类。可以大大提高程序的可维护性。

      在如下情况下,应当考虑使用抽象工厂模式:    

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
  • 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
  • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

    抽象工厂遵循 “开放--封闭” 原则

    "开放-封闭"原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
    增加产品族:Abstract Factory很好的支持了"开放-封闭"原则。
    增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
    综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。

c++ 实现的抽象工厂的一个简单实例

下载示例代码(vc6 下编译通过) AbstractFactorySample.rar
//---------header file

#include <iostream>
using namespace std;

class BaseProductA
{
protected:
 BaseProductA(){};
};
class BaseProductB
{
protected:
 BaseProductB(){};
};
class ProductA1:public BaseProductA
{
public:
 ProductA1(){cout<<"product A1 is created.."<<endl;};
};
class ProductA2:public BaseProductA
{
public:
 ProductA2(){cout<<"product A2 is created.."<<endl;};
};
class ProductB1:public BaseProductB
{
public:
 ProductB1(){cout<<"product B1 is created.."<<endl;};
};
class ProductB2:public BaseProductB
{
public:
 ProductB2(){cout<<"product B2 is created.."<<endl;};
};

class IFactory  
{
protected:
 IFactory();
 virtual ~IFactory()=0;
public:
 virtual BaseProductA* CreateProductA()=0;
 virtual BaseProductB* CreateProductB()=0;
};

class ConcreteFactory1:public IFactory
{
public:
 ConcreteFactory1(){cout<<"ConcreteFactory1 is created.."<<endl;};
public:
 virtual BaseProductA* CreateProductA();
 virtual BaseProductB* CreateProductB();
};
class ConcreteFactory2:public IFactory
{
public:
 ConcreteFactory2(){cout<<"ConcreteFactory2 is created.."<<endl;};
public:
 virtual BaseProductA* CreateProductA();
 virtual BaseProductB* CreateProductB();
};

//-----------------------header file end------------------------------------

// -----------------------cpp file--------------------------------

IFactory::IFactory()
{}

IFactory::~IFactory()
{}

BaseProductA* ConcreteFactory1::CreateProductA()
{
 return new ProductA1();
}

BaseProductB* ConcreteFactory1::CreateProductB()
{
 return new ProductB1();
}

BaseProductA* ConcreteFactory2::CreateProductA()
{
 return new ProductA2();
}

BaseProductB* ConcreteFactory2::CreateProductB()
{
 return new ProductB2();
}

int main(int argc, char* argv[])
{
 IFactory* pFactory1=new ConcreteFactory1();
 pFactory1->CreateProductA();
 pFactory1->CreateProductB();

 IFactory* pFactory2=new ConcreteFactory1();
 pFactory2->CreateProductA();
 pFactory2->CreateProductB();
 getchar();
 return 0;
}

//-----------------------cpp file end--------------------------


原文地址: http://www.gddhx.com/post/7.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值