C++设计模式-简单工厂模式 原创 设计模式 2021年10月15日 06:18 夏至未至 1325 当前内容 5114 字,在路上,马上到,马上到 ### 目录 [TOC] ### 工厂模式介绍 #### 实现方式 工厂模式有 3 种不同的实现 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 #### 何为简单工厂 > 把被创建的对象称为`产品`,把创建产品的类称为`工厂`。 如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式,在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。 #### 为何要用简单工厂 定义一个工厂类,它可以根据入参的不同,返回不同类的实例,被创建的实例通常都`具有共同的父类`。 #### 如何实现简单工厂 如下三步: 1. 将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类 2. 将它们公共的代码进行抽象和提取后封装在一个抽象产品类,每一个具体产品类都是抽象产品类的子类 3. 提供一个工厂类用于创建各种产品,工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象 #### 何时使用简单工厂: 在以下情况下可以考虑使用简单工厂模式: 1. `工厂类负责创建的对象比较少`,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。 2. 客户端只知道传入工厂类的参数,`对于如何创建对象并不关心`。 ##### 生活使用举例 不同工厂生产不同的产品:比如不同的球类工厂生产不同的球类。 ##### 软件使用举例 1. 日志管理器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 ### 模式特点 #### 优点 1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。 2. 客户端无需知道所创建具体产品的类名,只需知道参数即可。 #### 缺点 1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。 2. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂 3. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。 ### 模式角色类 #### 抽象产品类 Product:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。 #### 具体产品类 ConcreteProduct:抽象产品的派生类,包含具体产品特有的实现方法,是简单工厂模式的创建目标。 #### 简单工厂类 SimpleFactory:根据客户提供的具体产品参数,创建具体产品实例 ### 实操代码 #### 伪代码 // 抽象产品类 class AbstractProduct { public: //抽象方法: }; //具体产品类 class ConcreteProduct :public AbstractProduct { public: //具体实现方法 }; // 简单工厂 class SimpleFactory { public: AbstractProduct createProduct(string productName) { AbstractProduct pro = NULL; if (productName == "ProductA"){ pro = new ProductA(); } else if (productName == "ProductB"){ pro = new ProductB(); } ... } }; #### 实际代码 #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 SimpleFactory { public: // 1. 静态工厂方法,类外直接访问 // 2. 通过入参决定创建什么产品 static AbstractBallProduct* createProduct(const int productType) { AbstractBallProduct* pro = nullptr; if (productType == 0) { pro = new Basketball(); } else if (productType == 1) { pro = new Football(); } else if (productType == 2) { pro = new Volleyball(); } return pro; } }; // 简单工厂测试 int main() { //定义工厂类对象 AbstractBallProduct* product = nullptr; product = SimpleFactory::createProduct(0); product->productName(); product->productIntroduction(); delete product; std::cout << std::endl; product = SimpleFactory::createProduct(1); product->productName(); product->productIntroduction(); delete product; std::cout << std::endl; product = SimpleFactory::createProduct(2); product->productName(); product->productIntroduction(); delete product; getchar(); return 0; } #### 输出 篮球产品制造 小篮 这是一个蓝色的篮球 篮球产品销毁 足球产品制造 足球 这是一个白色的足球 足球产品销毁 排球产品制造 小排 这是也给紫色的排球 排球产品销毁 本文标题: C++设计模式-简单工厂模式 本文作者: 夏至未至 发布时间: 2021年10月15日 06:18 最近更新: 2022年2月26日 13:49 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 简单工厂模式(1) 上一个 MySQL表空间加密(TDE) 下一个 C++设计模式-单例模式 请可爱的你登录后回复 评论列表 (0条) 查看更多评论
评论列表 (0条)