前面说到了简单工厂模式和工厂方法模式,下面来介绍一下不太好理解的抽象工厂模式。

1. 情景与意图

   在日常生活中,作为小米品牌的粉丝,希望日常家居的电子设备希望全是小米品牌的,比如手机是小米的,插座是小米的,反正智能家居都是小米牌子的。这种同品牌的产品我们称之为系列产品。
   在日常开发中,经常面临着“一系列相互依赖的对象”的创建工 作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
此时我们需要提供一 种“封装机制”来避免客户程序和这种“多系列具体对象创建工作” 的紧耦合——抽象工厂模式

2. 抽象工厂模式

   将工厂进行抽象,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
   再举一个和作用有关的例子。比如现在产品有手机充电线,有手机。充电线有充电线的工程,手机有手机的工厂。假设买手机不提供充电线,因此我们需要自己买充电线。但是我们知道苹果手机必须是苹果手机的充电线,小米手机就要是小米手机的充电线,不能是苹果手机的充电线,因为不兼容。那么抽象工厂呢,就会提供苹果手机,苹果充电线这同一产品簇。

3. 抽象工厂代码实现

首先关于工厂的设计

// 首先需要一个抽象的工厂
class DPAbstractFactory {
public:
	virtual DPAbstractPhone* getPhone() = 0;
	virtual DPAbstractRouter* getRouter() = 0;
};
// 将工厂具体化:
// 小米的工厂
class DPMiFactory : public DPAbstractFactory {
	 DPAbstractPhone* getPhone();
	 DPAbstractRouter* getRouter();
};
// 华为的工厂
class DPHuaWeiFactory : public DPAbstractFactory {
	 DPAbstractPhone* getPhone();
	 DPAbstractRouter* getRouter();
};

下面设计产品簇


// 抽象的手机
class DPAbstractPhone {
public:
	virtual void normalFunction() = 0;
};

// 抽象的路由器
class DPAbstractRouter {
public:
	virtual void normalRouting() = 0;
};
// 具体化
class DPMiPhone : public DPAbstractPhone {
	void normalFunction();
};

class DPHuaWeiPhone : public DPAbstractPhone {
	void normalFunction();
};

class DPMiRouter : public DPAbstractRouter {
	void normalRouting();
};

class DPHuaWeiRouter : public DPAbstractRouter {
	void normalRouting();
};

使用

int main() {
	// 拿到工厂
	DPAbstractFactory* factory = new DPMiFactory();
	// 拿到手机
	DPAbstractPhone* phone = factory->getPhone();
	phone->normalFunction();
	return 0;
}

模式图解:
在这里插入图片描述

4. 抽象工厂模式总结

   抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构很复杂。
抽象工厂模式实现源代码见:【抽象工厂模式C++源码】

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐