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

设计模式Python版 简单工厂模式

文章目录

  • 前言
  • 一、简单工厂模式
  • 二、简单工厂模式示例
  • 三、简单工厂模式客户端改进


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

一、简单工厂模式

简单工厂模式(Simple Factory Pattern)

  • 定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。。

  • 解决问题:如何将对象的创建和对象的使用分离?

  • 使用场景:

    • 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
    • 当类创建的对象需要根据运行时的条件来决定时,如根据配置文件
  • 组成:

    • 工厂(Factory):负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
    • 抽象产品(Product):是简单工厂创建的所有对象的父类或接口,负责描述所有实例共有的公共接口。
    • 具体产品(Concrete Product):实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建。
  • 优点:

    • 隔离变化,把变化部分抽象独立出来。
    • 将对象的创建和使用分离,也使得系统更加符合单一职责原则,有利于对功能的复用和系统的维护。
  • 缺点:

    • 工厂类集中了所有产品的创建逻辑,职责过重
    • 采用简单工厂模式时,当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。

在这里插入图片描述

二、简单工厂模式示例

客户端代码通过调用Chart类的构造函数来创建图表对象,根据参数type的不同可以得到不同类型的图表,然后再调用display()方法来显示相应的图表。

  • 重构前代码:Chart类中包含很多“if…else…”代码块。Chart类的职责过重,它负责初始化和显示所有的图表对象。当需要增加新类型的图表时,必须修改Chart类的源代码,违反了开闭原则。
class Chat:
    def __init__(self, type: str):
        self.type = type
        if type == "histogram":
            print("初始化柱状图")
        elif type == "pie":
            print("初始化饼状图")
        elif type == "line":
            print("初始化折线图")

    def display(self):
        if self.type == "histogram":
            print("显示柱状图")
        elif self.type == "pie":
            print("显示饼状图")
        elif self.type == "line":
            print("显示折线图")

# 客户端测试代码
chat = Chat("pie")
chat.display()


### 输出结果
初始化饼状图
显示饼状图
  • 重构后代码:使用简单工厂模式重构代码
class Chat:
    """抽象产品"""

    def display(self):
        raise NotImplementedError


class HistogramChart(Chat):
    """具体产品"""

    def __init__(self):
        print("创建柱状图")

    def display(self):
        print("显示柱状图")


class PieChart(Chat):
    def __init__(self):
        print("创建饼状图")

    def display(self):
        print("显示饼状图")


class LineChart(Chat):
    def __init__(self):
        print("创建折线图")

    def display(self):
        print("显示折线图")


class ChartFactory:
    """工厂"""

    @staticmethod
    def get_chart(type: str) -> Chat:
        if type == "histogram":
            return HistogramChart()
        elif type == "pie":
            return PieChart()
        elif type == "line":
            return LineChart()


# 客户端测试代码
chart = ChartFactory.get_chart("line")
chart.display()


### 输出结果
创建折线图
显示折线图

三、简单工厂模式客户端改进

创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了开闭原则

  • 引入配置文件config.json和,从配置文件提取图表类型。如果需要更换具体图表对象,只需修改配置文件,无须修改任何源代码。
{
    "chart_type": "histogram"
}
  • JsonUtil工具类
# 模块 utils.py
from pathlib import Path
import json

class JsonUtil:
    @staticmethod
    def get_chart_type():
        path = Path("config.json")
        contents = path.read_text(encoding="utf-8")
        conf = json.loads(contents)
        return conf.get("chart_type", None)
  • 改进后客户端代码
from utils import JsonUtil

chart_type = JsonUtil.get_chart_type()
chart = ChartFactory.get_chart(chart_type)
chart.display()


### 输出结果
创建柱状图
显示柱状图

您正在阅读的是《设计模式Python版》专栏!关注不迷路~


http://www.kler.cn/a/516535.html

相关文章:

  • 【前端】Hexo 建站指南
  • C++----STL(list)
  • 《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》
  • 基于单片机的智能台灯设计
  • Debian 上安装PHP
  • DDD - 整洁架构_解决技术设计困局
  • OpenEuler学习笔记(十):用OpenEuler搭建web服务器
  • 【MCU】DFU、IAP、OTA
  • cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】
  • Mac 查看 Java SDK 和 Android SDK 的路径
  • 输入网址到网页显示,发生了什么--讲述
  • linux静态库+嵌套makefile
  • 【深度学习】 自动微分
  • python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算
  • Caesar
  • 【java】IP来源提取国家地址
  • PHP校园助手系统小程序
  • React 前端框架开发详细操作
  • 【AIGC提示词系统】赛博朋克·韵律:一个融合科技与艺术的对话系统设计
  • 如何构建一个简单的React应用?
  • 202009 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 使用qwen作为基座训练分类大模型
  • JAVA EE
  • 概率论里的特征函数,如何用卷积定理去理解
  • 代码随想录刷题day14(1)|(链表篇)142.环形链表 II
  • Linux内核中的InfiniBand核心驱动:verbs.c分析