C++实现抽象工厂模式
源代码仓库地址本篇文章主要用介绍用C++实现的设计模式,博文主要呈现逻辑和结构,单独设计模式的代码在每个模式的的【代码分析】结尾有链接,所有模式的具体源代码请访问上面的仓库地址。文章目录1. 设计模式介绍2. 简单工厂模式2.1 模式介绍2.2 模式图解2.3 代码分析2.4 简单工厂模式总结3. 抽象工厂模式3.1 模式介绍3.2 模式图解3.3 代码分析3.4 抽象工厂模式总结1. 设计模式介
前面说到了简单工厂模式和工厂方法模式,下面来介绍一下不太好理解的抽象工厂模式。
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++源码】
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)