抽象工厂模式C++实现

2014-11-24 07:27:23 · 作者: · 浏览: 0

抽象工厂模式

定义:

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

适用性:

1、 一个系统需要独立于它的产品的创建,组合和表示时

2、 一个系统需要由多个产品系列中的一个配置时

3、 当需要强调一系列相关的产品对象的设计以便进行联合使用时

4、 当提供一个产品类库,而只想显示它们的接口而不是实现时

优点:

1、 分离了具体类,使得客户与类的实现分离

2、 抑郁交换产品系列。

3、 有利于产品的一致性

缺点:

难以支持新种类的产品,不容易扩展

结构类图:

\

实现:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDwvcD4KPHAgYWxpZ249"left">

//产品类A的接口

class AbstractProductA

{

public:

virtual void funA() = 0;

protected:

private:

};

//A产品分有1和两个等级的产品

class ConcreteProductA1:public AbstractProductA

{

public:

voidfunA()

{

cout<<"ConcreteProductA1 funA()"<

}

protected:

private:

};

class ConcreteProductA2:public AbstractProductA

{

public:

voidfunA()

{

cout<<"ConcreteProductA2 funA()"<

}

protected:

private:

};

//产品类B的接口

class AbstractProductB

{

public:

virtual void funB() = 0;

protected:

private:

};

//B产品分有1和两个等级的产品

class ConcreteProductB1:public AbstractProductB

{

public:

voidfunB()

{

cout<<"ConcreteProductB1 funB()"<

}

protected:

private:

};

class ConcreteProductB2:public AbstractProductB

{

public:

voidfunB()

{

cout<<"ConcreteProductB2 funB()"<

}

protected:

private:

};

//抽象工厂,可以创建A和两类产品

class AbstractFactory

{

public:

virtualAbstractProductA *CreateProductA() = 0;

virtualAbstractProductB *CreateProductB() = 0;

protected:

private:

};

//具体产品工厂类,创建等级1的产品

class ConcretFactory1:public AbstractFactory

{

public:

AbstractProductA *CreateProductA()

{

returnnew ConcreteProductA1;

}

AbstractProductB *CreateProductB()

{

return new ConcreteProductB1;

}

protected:

private:

};

//具体产品工厂类,创建等级2的产品

class ConcretFactory2:public AbstractFactory

{

public:

AbstractProductA *CreateProductA()

{

returnnew ConcreteProductA2;

}

AbstractProductB *CreateProductB()

{

returnnew ConcreteProductB2;

}

protected:

private:

};

AbstractFactory*pFactory1 = new ConcretFactory1;

AbstractFactory *pFactory2 = new ConcretFactory2;

AbstractProductA *pA1 =pFactory1->CreateProductA();

AbstractProductA *pA2 = pFactory2->CreateProductA();

pA1->funA();

pA2->funA();

AbstractProductB *pB1 =pFactory1->CreateProductB();

AbstractProductB *pB2 =pFactory2->CreateProductB();

pB1->funB();

pB2->funB();

\