设计模式:抽象工厂

一、什么是抽象工厂

相较于简单工厂和普通工厂,抽象工厂最大的不同之处在于,它将产品子类以不同划分依据做分组,例如衣服裤子鞋子是一种分组,各种品牌是另一种分组,它支持将衣服的特性提取出来作为抽象产品,再根据不同的品牌具体化特征,按照不同品牌进行归类,是一种与现实联系更为密切的逻辑抽象,继承关系虽复杂而因对称而清晰。
他的优点在于封装发生了变化,封装了对象创建的具体细节,对添加新的产品组很方便需需修改已有系统,针对接口进行编程而不是针对具体进行编程。需要提供大量接口来创建独具特色的产品。

二、如何实现抽象工厂

  1. 提供一个抽象产品总特征作为抽象产品根
  2. 根据抽象产品根发散,产生抽象产品系列,并实现系列产品
  3. 创建抽象工厂,建立与抽象产品的联系,给出配套产品业务
  4. 实现抽象工厂的具体业务。

三、具体代码实现

1、抽象产品根

#include<iostream>
using namespace std;

//抽象产品根
class AbsProduct {
public:
	virtual ~AbsProduct() {};
	virtual void show() = 0;
};

2、产生抽象产品系列和具体产品系列

//比如衣服是抽象产品AbsProduct_A
//那具体产品Series_A1就可以是Nike衣服
//A2可以是360衣服,A3可以是XTEP衣服
class AbsProduct_A:public AbsProduct {
public:
	virtual ~AbsProduct_A() {};
	void show()override {
		cout << "product A" << endl;
	}
	virtual void func() = 0;
};
class Series_A1 :public AbsProduct_A {
public:
	void func() override {
		cout << "A1 function" << endl;
	}
};
class Series_A2 :public AbsProduct_A {
public:
	void func() override {
		cout << "A2 function" << endl;
	}
};
class Series_A3 :public AbsProduct_A {
public:
	void func() override {
		cout << "A3 function" << endl;
	}
};

//比如裤子是抽象产品AbsProduct_B
//那具体产品Series_B1就可以是Nike裤子
//B2可以是360裤子,B3可以是XTEP裤子
class AbsProduct_B:public AbsProduct {
public:
	~AbsProduct_B() {};
	void show() override {
		cout << "product B" << endl;
	}
	virtual void func() = 0;
};
class Series_B1 :public AbsProduct_B {
public:
	void func()override {
		cout << "B1 function" << endl;
	}
};
class Series_B2 :public AbsProduct_B {
public:
	void func()override {
		cout << "B2 function" << endl;
	}
};
class Series_B3 :public AbsProduct_B {
	void func()override {
		cout << "B3 function" << endl;
	}
};
//那么,A1与B1配套,A2与B2配套......

3、一个工厂生产一套产品的抽象

//抽象工厂,可以生产衣服鞋子,那Factory1就是Nike厂,
//Factory2就是360厂,Factory3就是XTEP厂。
class AbsFactory {
public:
	virtual ~AbsFactory() {};
	virtual AbsProduct_A* createA() = 0;
	virtual AbsProduct_B* createB() = 0;
};

4、具体化上面的抽象

class Factory1:public AbsFactory {
	AbsProduct_A* createA() override {
		return new Series_A1;
	}
	AbsProduct_B* createB() override{
		return new Series_B1;
	}
};
class Factory2 :public AbsFactory {
	AbsProduct_A* createA() override {
		return new Series_A2;
	}
	AbsProduct_B* createB() override {
		return new Series_B2;
	}
};
class Factory3 :public AbsFactory {
	AbsProduct_A* createA() override {
		return new Series_A3;
	}
	AbsProduct_B* createB() override {
		return new Series_B3;
	}
};

5、必要时加上用户接口

//还是子类对象初始化父类指针
//用户接口,要什么厂生产就传入什么参数即可。
static void func(int num) {
	//确定厂
	AbsFactory* pf;
	switch (num){
	case 1: {
		pf = new Factory1();
		break;
	}
	case 2: {
		pf = new Factory2();
		break;
	}
	case 3: {
		pf = new Factory3();
		break;
	}
	default:pf = nullptr; return;
	}
	//然后生产逻辑完全一致
	AbsProduct_A* pa = pf->createA();
	AbsProduct_B* pb = pf->createB();
	pa->show(); pa->func();
	pb->show(); pb->func();
	//避免内存泄漏
	pf->~AbsFactory();
	pa->~AbsProduct_A();
	pb->~AbsProduct_B();
}

6、调用main.cpp

int main() {
	func(1);
	func(2);
	func(3);
	func(4);
	return 0;
}

四、实现展示

在这里插入图片描述
好啦,今天的分享就到这里~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值