设计模式之抽象工厂模式

(一)概念:抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。


(二)模式中包含的角色及其职责

1、抽象工厂(Creator)角色 
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
 
2、具体工厂( Concrete  Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
 
3、抽象(Product)角色
抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
 
4、具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象


设计模式之抽象工厂模式_第1张图片

(三)抽象工厂模式的实现

#include 
using namespace std;

class Fruit
{
public:
	virtual void GetFruit() = 0;
};

class SouthApple: public Fruit
{
public:
	void GetFruit()
	{
		printf("我是南方生产的苹果\n");
	}
};

class NorthApple: public Fruit
{
public:
	void GetFruit()
	{
		printf("我是北方生产的苹果\n");
	}
};

class SouthPear: public Fruit
{
public:
	void GetFruit()
	{
		printf("我是南方生产的梨\n");
	}
};

class NorthPear: public Fruit
{
public:
	void GetFruit()
	{
		printf("我是北方生产的梨\n");
	}
};

class AbsFactory
{
public:
	virtual Fruit* CreateApple() = 0;
	virtual Fruit* CreatePear() = 0;
};

class SouthFactory: public AbsFactory
{
public:
	Fruit * CreateApple()
	{
		return new SouthApple;
	}
	Fruit * CreatePear()
	{
		return new SouthPear;
	}
};

class NorthFactory: public AbsFactory
{
public:
	Fruit * CreateApple()
	{
		return new NorthApple;
	}
	Fruit * CreatePear()
	{
		return new NorthPear;
	}
};

void func(AbsFactory *factory)
{
	Fruit * f1 = factory->CreateApple();
	Fruit * f2 = factory->CreatePear();

	f1->GetFruit();
	f2->GetFruit();

	delete f1;
	delete f2;

}

int main()
{
	AbsFactory *factory = new SouthFactory;  
	func(factory);
	delete factory;

	AbsFactory *factory1 = new NorthFactory;  
	func(factory1);
	delete factory1;


	return 0;
}


(四)三种工厂模式的区别

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

你可能感兴趣的