创建型模式----抽象工厂模式(C++)

创建型模式----抽象工厂模式

抽象工厂模式用于产品族的构建,是所有形态的工厂模式中最为抽象和最具一般性的模式

抽象工厂模式是一种为访问类提供一个创建一组或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产多个等级的产品

实现原理

抽象工厂模式是针对产品族的,而不是像工厂方法模式针对一个产品等级
在这里插入图片描述

角色组成

和工厂方法模式相同,抽象工厂模式同样拥有四种角色

  • 抽象工厂:提供了创建产品的接口
  • 具体工厂:主要实现了抽象工厂的抽象方法,用于创建具体产品
  • 抽象产品:定义了产品的规范,描述的产品(多个)的具体特性
  • 具体产品:实现了抽象产品的接口,由具体工厂创建
抽象工厂模式UML类图

在这里插入图片描述

抽象工厂实例

#include <iostream>
using namespace std;

//抽象矩形
class Rect {
public:
	virtual void showName() = 0;
};

//矩形A
class RectA : public Rect {
public:
	virtual void showName()
	{
		cout << "我是矩形A!" << endl;
	}
};

//矩形B
class RectB : public Rect {
public:
	virtual void showName()
	{
		cout << "我是矩形B!" << endl;
	}
};

//抽象圆形
class Circle {
public:
	virtual void showName() = 0;
};

//圆形A
class CircleA : public Circle {
public:
	virtual void showName()
	{
		cout << "我是圆形A!" << endl;
	}
};

//圆形B
class CircleB : public Circle {
public:
	virtual void showName()
	{
		cout << "我是圆形B!" << endl;
	}
};

//抽象工厂
class AbstractFactory
{
public:
	virtual Rect* CreatRectFactory() = 0;
	virtual Circle* CreatCircleFactory() = 0;
};

//具体工厂A
class FactoryA : public AbstractFactory
{
public:
	virtual RectA* CreatRectFactory(){	
		return new RectA;
	}
	virtual CircleA* CreatCircleFactory() {
		return new CircleA;
	}

};

//具体工厂B
class FactoryB : public AbstractFactory
{
public:
	virtual RectB* CreatRectFactory() {
		return new RectB;
	}
	virtual CircleB* CreatCircleFactory() {
		return new CircleB;
	}

};

int main()
{
	FactoryA* Fa = new FactoryA;
	RectA* Ra = new RectA;
	CircleA* Ca = new CircleA;

	Ra = Fa->CreatRectFactory();
	Ca = Fa->CreatCircleFactory();
	Ra->showName();
	Ca->showName();

	delete Fa;
	delete Ra;
	delete Ca;

	cout << endl;

	FactoryB* Fb = new FactoryB;
	RectB* Rb = new RectB;
	CircleB* Cb = new CircleB;

	Rb = Fb->CreatRectFactory();
	Cb = Fb->CreatCircleFactory();
	Rb->showName();
	Cb->showName();

	delete Fb;
	delete Rb;
	delete Cb;

	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章