当前位置: 首页 > news >正文

设计模式---简单工厂模式

简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得客户端不需要直接实例化具体的类。

简单工厂模式的核心要素:

  1. Product(产品接口):定义了工厂方法所创建的对象的接口。
  2. ConcreteProduct(具体产品):实现了 Product 接口的具体类。
  3. Factory(工厂):提供一个静态方法来创建 Product 对象的实例。

示例:创建不同类型的 Shape 对象

我们将使用简单工厂模式来创建不同类型的 Shape 对象,例如 CircleRectangle

1. 定义 Shape 类(产品接口)
#include <iostream>// Product interface
class Shape {
public:virtual ~Shape() = default;virtual void draw() const = 0;
};

2. 定义 ConcreteProduct 类(具体产品)

// ConcreteProduct 1
class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing a circle." << std::endl;}
};// ConcreteProduct 2
class Rectangle : public Shape {
public:void draw() const override {std::cout << "Drawing a rectangle." << std::endl;}
};

3. 定义 Factory 类(工厂)

#include <string>// Factory
class ShapeFactory {
public:static Shape* createShape(const std::string& type) {if (type == "Circle") {return new Circle();} else if (type == "Rectangle") {return new Rectangle();} else {return nullptr;}}
};

4. 使用简单工厂模式

int main() {// 使用工厂创建不同类型的 Shape 对象Shape* shape1 = ShapeFactory::createShape("Circle");Shape* shape2 = ShapeFactory::createShape("Rectangle");// 调用方法if (shape1) {shape1->draw();}if (shape2) {shape2->draw();}// 清理资源delete shape1;delete shape2;return 0;
}

解释

  1. Shape 类是产品接口,定义了所有具体产品必须实现的方法 draw
  2. CircleRectangle 类是具体产品,它们实现了 Shape 接口的 draw 方法。
  3. ShapeFactory 类是工厂,提供一个静态方法 createShape,根据传入的类型参数创建不同的 Shape 对象。这种方法将对象创建的逻辑集中在工厂类中,简化了客户端的代码。
  4. main 函数 中,通过工厂方法创建 Shape 对象,并调用其 draw 方法进行演示。

简单工厂模式的优点在于它将对象创建的逻辑集中到工厂类中,使得客户端代码变得更简单、更清晰。然而,简单工厂模式也有局限性,例如它违反了开闭原则(即添加新产品时需要修改工厂代码)。在需要扩展产品类型时,可以考虑使用工厂方法模式或抽象工厂模式等更灵活的设计模式。

http://www.lryc.cn/news/430202.html

相关文章:

  • Vue | Vue 中的 refInForde 用法
  • 【原创】java+swing+mysql房屋租赁管理系统设计与实现
  • Django 中render、redirect 和 HttpResponse的区别
  • CRYPTO 2020
  • java 函数接口Consumer简介与示例【函数式编程】【Stream】
  • 黑神话:悟空-配置推荐
  • Android14 蓝牙设备类型修改
  • vue3 语法糖<script setup>
  • 微服务设计原则——高性能:异步与并发
  • 机器学习——决策树,朴素贝叶斯
  • C语言基础(十)
  • 人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证
  • Android 上下滑隐藏显示状态栏
  • USBCAN-II/II+使用方法以及qt操作介绍
  • 笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
  • Kubernetes 清理资源常用的 Kubernetes 清理命
  • 【数据结构初阶】二叉树--基本概念
  • Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型
  • 第二百零九节 Java格式 - Java数字格式类
  • LSI-9361阵列卡笔记
  • ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析
  • ASIACRYPT 2021
  • C#学习之路day1
  • 【安当产品应用案例100集】010-基于国密UKEY的信封加密应用案例
  • 扫码点餐系统小程序功能分析
  • 网络安全——基础知识记忆梳理
  • GitHub开源的轻量级文件服务器,可docker一键部署
  • Scratch编程深度探索:解锁递归与分治算法的奥秘
  • 使用docker compose一键部署 Portainer
  • js原生模板引擎