设计模式之抽象工厂模式(C++实现)
更多设计模式参看: 设计模式之模式概述(模式汇总)(C++实现)
文章目录
- 介绍
- 意图:
- 解决问题:
- 实现概述:
- 要点:
- 应用场景:
- 生活中场景
- 软件中场景
- 优点:
- 缺点:
- 模式结构
- 角色
- 代码示例
- GitHub
- 定义抽象产品类
- 定义具体产品类
- 定义抽象工厂类
- 定义具体工厂类
- 测试
- 输出
介绍
工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。一个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。
引入两个概念:
(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
意图:
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
解决问题:
主要解决接口选择的问题。
实现概述:
要点:
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
应用场景:
在以下情况下可以考虑使用抽象工厂模式:
(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,用户无须关心对象的创建过程,将对象的创建和使用解耦。
(2) 系统中有多于一个的产品族,而每次只使用其中某一产品族。
(3) 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。
(4) 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
生活中场景
比如如海尔电器工厂既生产海尔电视机也生产海尔电冰箱
软件中场景
QQ 换皮肤,一整套一起换
优点:
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建,这使得更换一个具体工厂就变得相对容易
- 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
- 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
模式结构
角色
● 抽象工厂(AbstractFactory):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
● 具体工厂(ConcreteFactory):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
● 抽象产品(AbstractProduct):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
● 具体产品(ConcreteProduct):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品
//抽象产品类A
class AbstractProductA
{public://抽象方法:
};//具体产品类A
class ConcreteProductA :public AbstractProductA
{public://具体实现方法
};
//抽象产品类B
class AbstractProductB
{public://抽象方法:
};//具体产品类B
class ConcreteProductB :public AbstractProductB
{public://具体实现方法
};//抽象工厂类
class AbstractFactory
{public://抽象方法生产产品A:virtual AbstractProductA * createProductA() = 0;virtual AbstractProductB * createProductB() = 0;
};//具体工厂类A
class ConcreteFactoryA :public AbstractFactory
{public://具体工厂生产具体产品
};
//具体工厂类B
class ConcreteFactoryB :public AbstractFactory
{public://具体工厂生产具体产品
};
代码示例
GitHub
AbstractFactory
定义抽象产品类
///定义抽象产品类
class AbstractPhoneProduct
{public:virtual ~AbstractPhoneProduct() = default;//抽象方法:virtual void productName() = 0;virtual void productIntroduction() = 0;
protected:AbstractPhoneProduct()= default;};
///定义抽象产品类
class AbstractTVProduct
{public:virtual ~AbstractTVProduct() = default;//抽象方法:virtual void productName() = 0;virtual void productIntroduction() = 0;
protected:AbstractTVProduct()= default;};
定义具体产品类
///2个具体产品类
///具体产品类 HWPhone
class HWPhone :public AbstractPhoneProduct
{public:HWPhone() = default;~HWPhone() override {std::cout << "HWPhone Bye" << std::endl;};void productName() override{std::cout << "This is a HWPhone" << std::endl;}void productIntroduction() override{std::cout << "Introduction for HWPhone" << std::endl;}
};///具体产品类 MIPhone
class MIPhone :public AbstractPhoneProduct
{public:MIPhone() = default;~MIPhone() override {std::cout << "MIPhone Bye" << std::endl;};void productName() override{std::cout << "This is a MIPhone" << std::endl;}void productIntroduction() override{std::cout << "Introduction for MIPhone" << std::endl;}
};///2个具体产品类
///具体产品类 HWTV
class HWTV :public AbstractTVProduct
{public:HWTV() = default;~HWTV() override {std::cout << "HWTV Bye" << std::endl;};void productName() override{std::cout << "This is a HWTV" << std::endl;}void productIntroduction() override{std::cout << "Introduction for HWTV" << std::endl;}
};///具体产品类 MITV
class MITV :public AbstractTVProduct
{public:MITV() = default;~MITV() override {std::cout << "MITV Bye" << std::endl;};void productName() override{std::cout << "This is a MITV" << std::endl;}void productIntroduction() override{std::cout << "Introduction for MITV" << std::endl;}
};
定义抽象工厂类
/// 定义抽象工厂类
class AbstractFactory
{public:virtual ~AbstractFactory() = default;virtual AbstractPhoneProduct * createPhone() = 0;virtual AbstractTVProduct * createTV() = 0;
protected:AbstractFactory() = default;
};
定义具体工厂类
///两个具体工厂类
///具体工厂类 生产多个产品
class HWFactory : public AbstractFactory
{public:HWFactory() = default;~HWFactory() override {std::cout << "HWFactory Bye" << std::endl;};AbstractPhoneProduct *createPhone() override{return new HWPhone();}AbstractTVProduct *createTV() override{return new HWTV();}
};///具体工厂类 生产多个产品
class MIFactory : public AbstractFactory
{public:MIFactory() = default;~MIFactory() override {std::cout << "MIFactory Bye" << std::endl;};AbstractPhoneProduct *createPhone() override{return new MIPhone();}AbstractTVProduct *createTV() override{return new MITV();}
};
测试
int main() {std::cout << "抽象工厂模式" << std::endl;//定义工厂类对象和产品类对象AbstractPhoneProduct *phone = nullptr;AbstractTVProduct *tv = nullptr;AbstractFactory *factory = nullptr;factory = new HWFactory();phone = factory->createPhone();phone->productName();tv = factory->createTV();tv->productIntroduction();delete factory;delete phone;delete tv;factory = new MIFactory();phone = factory->createPhone();phone->productName();tv = factory->createTV();tv->productIntroduction();delete factory;delete phone;delete tv;getchar();return 0;
}
输出
个人能力有限,如有错误之处或者其他建议,敬请告知欢迎探讨,谢谢!
设计模式之抽象工厂模式(C++实现)相关推荐
- 设计模式系列·抽象工厂模式
前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...
- 设计模式三—抽象工厂模式
设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...
- 设计模式复习-抽象工厂模式
设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...
- 设计模式之四(抽象工厂模式第三回合)
原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...
- python抽象工厂模式_Python设计模式之抽象工厂模式
Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...
- 设计模式-04抽象工厂模式
设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...
- C#设计模式(4)——抽象工厂模式
C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...
- 设计模式之抽象工厂模式(Abstract Factory)摘录
面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...
- java 工厂模式的写法_Java23种设计模式之抽象工厂模式
概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
最新文章
- python 点的投影变换
- GNU ARM汇编--(二)汇编编译链接与运行
- 什么是SQL 注入?
- C语言程序设计 | 结构体内存对齐,位段
- Linux-文件和目录操作命令
- oracle 快照过旧怎么回退_我的世界20w45a:1.17首个快照!加入水晶、蜡烛、口袋、铜锭……...
- JavaSE IDEA 使用-面向对象
- eclipse安装Spring插件
- TMS570-5-RTI精准延时
- 解密搭建平台赚钱的方法一:详解搭建网站收入的几个来源
- 《孙子兵法》帮你找到合格的管理者
- python2 + django 导出 excel 功能 接口示例代码(做记录)
- 1-14 Burpsuite Repeater介绍
- 《我是个怪圈》读书笔记
- HyperLPR车牌识别库代码分析(9)
- 《无懈可击的Web设计》--学习笔记
- 对于建站程序 织梦、帝国、wordpress 哪个好?
- 信贷风险定价怎么做?
- 《算法竞赛入门经典(第二版)》习题解答——第二章
- AmazeUI 文本大小对照表