【C++设计模式】抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxh2075/article/details/53502343
#ifndef __ABSTRACTFACTORY_H__
#define __ABSTRACTFACTORY_H__

#include <string>

//【说明】
// 当产品结构比较复杂的时候,工厂方法也无法满足产品的划分和构建。如A,B是一类产品,而中国制造的A,B和美国制造的A,B又要区分为不同的产品族。
// 抽象工厂将创建A,B对象的接口都放到一个基类中,子类在产品族的层面来扩展,通过不同的接口创建不同的对象。

//【定义】
// 抽象工厂模式 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

//【角色】
// 1) 抽象产品(Product):描述具体产品的公共接口。
// 2) 具体产品(ConcreteProduct):工厂类创建的目标类,描述生产的具体产品。
// 3) 抽象工厂(Creator):声明一系列创建产品的工厂方法接口,返回抽象产品。
// 4) 真实工厂(ConcreteCreator):实现抽象工厂的方法,返回某个产品的实例,由客户调用。

//【意义】
// 抽象工厂的工作是将"抽象零件"组装为"抽象产品",我们并不关心零件的具体实现,而是只关心接口(API),我们仅使用接口(API)将零件组装为产品。
// 当在两个维度上细化产品类型时,抽象工厂给出了如何创建对象的一种方案,但是随着产品类型的细化也带来了工厂类数量的剧增。

//【示例】

//产品A,B属于一类产品
class iProductA 
{
public:	
	iProductA(){ }

	virtual ~iProductA(){ }

public:	
	virtual void PrintProductA() = 0;
};

class iProductB
{
public:	
	iProductB(){ }

	virtual ~iProductB(){ }

public:	
	virtual void PrintProductB() = 0;
};

//中国制造和美国制造属于不同产品族
class ChinaProductA : public iProductA
{
public:
	virtual void PrintProductA();
};

class ChinaProductB : public iProductB
{
public:
	virtual void PrintProductB();
};

class AmericaProductA : public iProductA
{
public:
	virtual void PrintProductA();
};

class AmericaProductB : public iProductB
{
public:
	virtual void PrintProductB();
};

//抽象工厂,提供创建一类产品的接口
class iAbstractFactory
{
public:	
	iAbstractFactory(){ }

	virtual ~iAbstractFactory(){ }

public:	
	virtual iProductA* CreateProductA() = 0 ;

	virtual iProductB* CreateProductB() = 0 ;
		
};

//子类继承抽象工厂对产品族进行分类
class ChinaFactory: public iAbstractFactory
{
public:
	virtual iProductA* CreateProductA();

	virtual iProductB* CreateProductB();

};

class AmericaFactory: public iAbstractFactory
{
public:
	virtual iProductA* CreateProductA();

	virtual iProductB* CreateProductB();

};

void TestAbstractFactory();

#endif



#include "AbstractFactory.h"

void ChinaProductA::PrintProductA()
{
	printf("Print ChinaProductA. \n");
}

void ChinaProductB::PrintProductB()
{
	printf("Print ChinaProductB. \n");
}

void AmericaProductA::PrintProductA()
{
	printf("Print AmericaProductA. \n");
}

void AmericaProductB::PrintProductB()
{
	printf("Print AmericaProductB. \n");
}

iProductA* ChinaFactory::CreateProductA()
{
	return new ChinaProductA();
}

iProductB* ChinaFactory::CreateProductB()
{
	return new ChinaProductB();
}

iProductA* AmericaFactory::CreateProductA()
{
	return new AmericaProductA();
}

iProductB* AmericaFactory::CreateProductB()
{
	return new AmericaProductB();
}

void TestAbstractFactory()
{
	iAbstractFactory *cf = new ChinaFactory();

	iProductA *ca = cf->CreateProductA();

	iProductB *cb = cf->CreateProductB();

	ca->PrintProductA();

	cb->PrintProductB();

	delete cf; 
	delete ca;
	delete cb;

	iAbstractFactory * af = new AmericaFactory();

	iProductA *aa = af->CreateProductA();

	iProductB *ab = af->CreateProductB();

	aa->PrintProductA();

	ab->PrintProductB();

	delete af; 
	delete aa;
	delete ab;
}

猜你喜欢

转载自blog.csdn.net/zxh2075/article/details/53502343
今日推荐