【C++】简单工厂模式

2023年12月6日,周三下午

今天又学习了一次简单工厂模式

每多学习一次,都会加深对设计模式的理解


目录


什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种通过使用一个共同的接口来创建不同类型对象的方法。

在简单工厂模式中,有一个工厂类负责创建对象,而不是直接在客户端代码中实例化对象。客户端只需要通过向工厂类发送请求,并传递相应的参数,工厂类就会根据参数的不同来创建具体的对象。

简单工厂模式包含以下几个角色:

  • 工厂类(Factory Class):负责根据客户端的请求创建对象,并将对象返回给客户端。
  • 抽象产品类(Abstract Product Class):定义了产品的共同接口,用于描述具体产品类的共同特征。
  • 具体产品类(Concrete Product Class):实现了抽象产品类的接口,具体产品类是由工厂类创建的对象。

简单工厂模式的优缺点

简单工厂模式的优势在于将对象的创建和使用进行了分离,客户端只需要关心如何使用对象,而无需关心对象的创建过程。这样可以降低代码的耦合性,并提供了一定的灵活性,如果需要新增或修改产品,只需要修改工厂类即可。

然而,简单工厂模式也有一些限制。例如,当需要创建的产品类型较多时,工厂类的代码会变得复杂,违反了开闭原则。此外,简单工厂模式也无法满足创建对象的变化需求,需要借助其他的创建型设计模式,如工厂方法模式或抽象工厂模式。

举例说明

cpp 复制代码
#include <iostream>

// 抽象产品类
class Shape {
public:
  virtual void draw() = 0;
};

// 具体产品类:圆形
class Circle : public Shape {
public:
  void draw() override {
    std::cout << "Draw a circle." << std::endl;
  }
};

// 具体产品类:矩形
class Rectangle : public Shape {
public:
  void draw() override {
    std::cout << "Draw a rectangle." << std::endl;
  }
};

// 工厂类
class ShapeFactory {
public:
  // 创建具体产品对象的方法
  Shape* createShape(const std::string& type) {
    if (type == "circle") {
      return new Circle();
    } else if (type == "rectangle") {
      return new Rectangle();
    } else {
      return nullptr; // 可以根据实际情况返回默认的或者异常处理
    }
  }
};

int main() {
  ShapeFactory factory;
  
  Shape* shape1 = factory.createShape("circle");
  shape1->draw();  // 输出:Draw a circle.

  Shape* shape2 = factory.createShape("rectangle");
  shape2->draw();  // 输出:Draw a rectangle.

  return 0;
}
相关推荐
ZZZ_O^O30 分钟前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
小飞猪Jay3 小时前
C++面试速通宝典——13
jvm·c++·面试
rjszcb4 小时前
一文说完c++全部基础知识,IO流(二)
c++
小字节,大梦想4 小时前
【C++】二叉搜索树
数据结构·c++
吾名招财5 小时前
yolov5-7.0模型DNN加载函数及参数详解(重要)
c++·人工智能·yolo·dnn
我是哈哈hh5 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
憧憬成为原神糕手5 小时前
c++_ 多态
开发语言·c++
郭二哈5 小时前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -5 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
丶Darling.5 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树