C++设计模式-工厂方法模式 原创 设计模式 2021年10月16日 15:51 夏至未至 969 当前内容 6637 字,在路上,马上到,马上到 ### 目录 [TOC] ### 工厂方法模式介绍 #### 什么是工厂方法 工厂方法模式是对简单工厂模式的进一步抽象,使系统在不修改原代码的情况下引进新的产品,即满足`开闭原则`。 #### 为何使用工厂方法 工厂方法模式,定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern)。工厂方法模式是一种类创建型模式。 #### 如何实现工厂方法 工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。 #### 模式关键 基于工厂角色和产品角色的`多态性设计`是工厂方法模式的关键。不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。 #### 何时使用工厂方法 以下情况下可以考虑使用工厂方法模式: - 客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。 - 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。 ### 模式特点 #### 优点 - 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。 - 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。 - 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。 #### 缺点 - 类的个数容易过多,增加复杂度 - 增加了系统的抽象性和理解难度 - 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。 ### 模式角色类 - 抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。 - 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。 - 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。 - 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。 ### 实操代码 个人建议,把代码上手改一改,跑一跑,记忆更深刻。 #### 伪代码实现 //抽象产品类 class AbstractProduct { public: // 抽象方法: }; // 具体产品类(集成自抽象产品类) class ConcreteProduct :public AbstractProduct { public: // 具体实现方法 }; // 抽象工厂类 class AbstractFactory { public: // 抽象方法生产产品: virtual AbstractProduct * createProduct() = 0; }; // 具体工厂类(继承自抽象工厂类) class ConcreteFactory :public AbstractFactory { public: // 具体工厂生产具体产品 }; #### 上机示例代码 场景:不同的球类工厂生产不同的球类。 文件名:工厂方法.cpp #include //定义抽象产品类 class AbstractBallProduct { public: // default 自动生成函数体 virtual ~AbstractBallProduct() = default; //定义抽象方法: // 产品名称 virtual void productName() = 0; // 产品介绍 virtual void productIntroduction() = 0; protected: AbstractBallProduct() = default; }; //定义具体产品类 //具体产品类 Basketball class Basketball :public AbstractBallProduct { public: Basketball() { std::cout << "篮球产品制造" << std::endl; } ~Basketball() { std::cout << "篮球产品销毁" << std::endl; } void productName() { std::cout << "小篮" << std::endl; } void productIntroduction() { std::cout << "这是一个蓝色的篮球" << std::endl; } }; //具体产品类 Football class Football :public AbstractBallProduct { public: Football() { std::cout << "足球产品制造" << std::endl; } ~Football() { std::cout << "足球产品销毁" << std::endl; } void productName() { std::cout << "足球" << std::endl; } void productIntroduction() { std::cout << "这是一个白色的足球" << std::endl; } }; //具体产品类 Volleyball class Volleyball :public AbstractBallProduct { public: Volleyball() { std::cout << "排球产品制造" << std::endl; } ~Volleyball() { std::cout << "排球产品销毁" << std::endl; } void productName() { std::cout << "小排" << std::endl; } void productIntroduction() { std::cout << "这是也给紫色的排球" << std::endl; } }; // 定义抽象工厂类 class AbstractFactory { public: virtual ~AbstractFactory() = default; virtual AbstractBallProduct* createProduct() = 0; protected: AbstractFactory() = default; }; // 三个具体工厂类(具体工厂类 只生产单一产品) class BasketballFactory : public AbstractFactory { public: BasketballFactory() { std::cout << "篮球工厂建立拉" << std::endl; }; ~BasketballFactory() override { std::cout << "篮球工厂推倒拉" << std::endl; }; AbstractBallProduct* createProduct() override { // 篮球工厂只生产篮球 return new Basketball(); } }; class FootballFactory : public AbstractFactory { public: FootballFactory() { std::cout << "足球工厂建立拉" << std::endl; } ~FootballFactory() override { std::cout << "足球工厂倒闭拉" << std::endl; }; AbstractBallProduct* createProduct() override { // 足球工厂只生产足球 return new Football(); } }; class VolleyballFactory : public AbstractFactory { public: VolleyballFactory() { std::cout << "排球工厂建立拉" << std::endl; } ~VolleyballFactory() override { std::cout << "排球工厂倒闭拉" << std::endl; }; AbstractBallProduct* createProduct() override { // 排球工厂只生产排球 return new Volleyball(); } }; // 测试 int main() { std::cout << "网站:https://www.codecomeon.com/" << std::endl; std::cout << std::endl; std::cout << "工厂方法模式" << std::endl; //定义工厂类对象和产品类对象(抽象父类) AbstractBallProduct* product = nullptr; AbstractFactory* factory = nullptr; std::cout << std::endl; // 创建篮球工厂 factory = new BasketballFactory(); // 篮球工厂创建篮球产品 product = factory->createProduct(); product->productName(); // 销毁篮球工厂 delete factory; // 销毁篮球产品 delete product; std::cout << std::endl; // 创建足球工厂 factory = new FootballFactory(); // 足球工厂创建足球产品 product = factory->createProduct(); product->productIntroduction(); // 销毁足球工厂 delete factory; // 销毁足球产品 delete product; std::cout << std::endl; // 创建排球工厂 factory = new VolleyballFactory(); // 排球工厂创建排球产品 product = factory->createProduct(); product->productIntroduction(); // 销毁排球工厂 delete factory; // 销毁排球产品 delete product; std::cout << std::endl; getchar(); return 0; } #### 控制台执行输出 网站:https://www.codecomeon.com/ 工厂方法模式 篮球工厂建立拉 篮球产品制造 小篮 篮球工厂推倒拉 篮球产品销毁 足球工厂建立拉 足球产品制造 这是一个白色的足球 足球工厂倒闭拉 足球产品销毁 排球工厂建立拉 排球产品制造 这是也给紫色的排球 排球工厂倒闭拉 排球产品销毁 本文标题: C++设计模式-工厂方法模式 本文作者: 夏至未至 发布时间: 2021年10月16日 15:51 最近更新: 2022年2月7日 16:45 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 上一个 C++设计模式-抽象工厂模式 下一个 使用systemctl启动和停止MySQL服务 当前文章评论暂未开放,请移步至留言处留言。