C++设计模式-抽象工厂模式 原创 设计模式 2021年10月17日 15:52 夏至未至 936 当前内容 8142 字,在路上,马上到,马上到 ### 目录 [TOC] ### 抽象工厂模式介绍 #### 什么是抽象工厂 `工厂方法模式中考虑的是一类产品的生产`,如篮球工厂只生产篮球、足球工厂只生产足球,再比如幼师学校只培养幼师。 一个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个 `产品族` ,由同一个工厂来统一生产,`如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器`。 抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。 1. 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。 2. 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。 #### 为何使用抽象工厂 主要解决接口选择的问题。抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,`它负责创建一族产品`。 #### 何时使用抽象工厂 在以下情况下可以考虑使用抽象工厂模式: - 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,用户无须关心对象的创建过程,将对象的创建和使用解耦。 - 系统中有多于一个的产品族,而每次只使用其中某一产品族。 - 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。 - 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。 #### 使用场景 ##### 生活中 比如华为生产手机、电视、电脑、手表、平板等;小米生产手机、电视、电脑、手表、平板等 ##### 软件中 博客换皮肤、换主题,符合一类功能的,一起换主题; ### 模式特点 #### 优点 - 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建,这使得更换一个具体工厂就变得相对容易 - 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。 - 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。 #### 缺点 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。 ### 模式角色类 - 抽象工厂(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: // 具体工厂生产具体产品 }; #### 上机代码实现 文件名:抽象工厂.cpp #include //定义手机抽象产品类 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() { std::cout << "华为手机被制造" << std::endl; } ~HWPhone() override { std::cout << "华为手机被销毁" << std::endl; }; void productName() override { std::cout << "华为手机品牌" << std::endl; } void productIntroduction() override { std::cout << "这是华为手机" << std::endl; } }; // 具体产品类 MIPhone class MIPhone :public AbstractPhoneProduct { public: MIPhone() { std::cout << "小米手机被创建" << std::endl; } ~MIPhone() override { std::cout << "小米手机被销毁" << std::endl; }; void productName() override { std::cout << "小米手机品牌" << std::endl; } void productIntroduction() override { std::cout << "这是小米手机" << std::endl; } }; // 2个具体电视产品类 // 具体产品类 HWTV class HWTV :public AbstractTVProduct { public: HWTV() { std::cout << "华为电视被制造" << std::endl; } ~HWTV() override { std::cout << "华为电视被销毁" << std::endl; }; void productName() override { std::cout << "华为电视品牌" << std::endl; } void productIntroduction() override { std::cout << "这是华为电视" << std::endl; } }; // 具体产品类 MITV class MITV :public AbstractTVProduct { public: MITV() { std::cout << "小米电视被制造" << std::endl; } ~MITV() override { std::cout << "小米电视被销毁" << std::endl; }; void productName() override { std::cout << "这是小米电视品牌" << std::endl; } void productIntroduction() override { std::cout << "这是小米电视" << 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() { std::cout << "华为工厂被创建,能创建华为品牌手机、电视" << std::endl; } ~HWFactory() override { std::cout << "华为工厂被销毁" << std::endl; }; AbstractPhoneProduct* createPhone() override { // 华为工厂制造华为手机 return new HWPhone(); } AbstractTVProduct* createTV() override { // 华为工厂制造华为电视 return new HWTV(); } }; class MIFactory : public AbstractFactory { public: MIFactory() { std::cout << "小米工厂被创建,能创建小米品牌手机、电视" << std::endl; } ~MIFactory() override { std::cout << "小米工厂被销毁" << std::endl; }; AbstractPhoneProduct* createPhone() override { // 小米工厂生产小米手机 return new MIPhone(); } AbstractTVProduct* createTV() override { // 小米工厂制造小米电视 return new MITV(); } }; // 测试 int main() { std::cout << "网站:https://www.codecomeon.com/" << std::endl; std::cout << std::endl; std::cout << "抽象工厂模式" << std::endl; 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; std::cout << std::endl; // 创建小米工厂 factory = new MIFactory(); // 创建小米手机 phone = factory->createPhone(); phone->productName(); // 创建小米电视 tv = factory->createTV(); tv->productIntroduction(); delete factory; delete phone; delete tv; std::cout << std::endl; getchar(); return 0; } #### 控制台执行输出 网站:https://www.codecomeon.com/ 抽象工厂模式 华为工厂被创建,能创建华为品牌手机、电视 华为手机被制造 华为手机品牌 华为电视被制造 这是华为电视 华为工厂被销毁 华为手机被销毁 华为电视被销毁 小米工厂被创建,能创建小米品牌手机、电视 小米手机被创建 小米手机品牌 小米电视被制造 这是小米电视 小米工厂被销毁 小米手机被销毁 小米电视被销毁 本文标题: C++设计模式-抽象工厂模式 本文作者: 夏至未至 发布时间: 2021年10月17日 15:52 最近更新: 2022年2月7日 17:33 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 上一个 C++设计模式-原型模式 下一个 C++设计模式-工厂方法模式 请可爱的你登录后回复 评论列表 (0条) 查看更多评论
评论列表 (0条)