简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

简单工厂模式结构

Product 产品声明接口,创建者及其子类生成的所有对象都通用

Concrete ProductA/B是产品接口的不同实现

Creator 创建者声明工厂方法,此方法返回的类型必须与产品接口匹配,可以将工厂方法声明为抽象方法,强制其子类必须实现自己的方法

ConcreteCreatorA/B 重写工厂方法,以便返回不同的产品

 from __future__ import annotations
from abc import ABC, abstractmethod class Creator(ABC):
"""
Creator类声明应该返回产品类的对象的工厂方法。创建者的子类通常提供此方法的实现。使用abstractmethod方式,强制子类必须实现factory_method
""" @abstractmethod
def factory_method(self):
"""
创建者可以提供factory方法的一些默认实现。
"""
pass def some_operation(self) -> str:
"""
不关心是谁创建的产品,写了自己的业务,子类可以重写
""" # 调用工厂方法,创建一个产品
product = self.factory_method() # 使用产品,不关心产品类型
result = f"创建者不关心产品类型, {product.operation()}" return result """
具体的创建者重写工厂方法以更改结果产品的类型。
""" class ConcreteCreator1(Creator):
"""
具体的生产者重写工厂方法以生产自己的产品。
具体产品实际上是从该方法返回的
""" def factory_method(self) -> ConcreteProduct1:
return ConcreteProduct1() class ConcreteCreator2(Creator):
def factory_method(self) -> ConcreteProduct2:
return ConcreteProduct2() class Product(ABC):
"""
产品接口声明所有具体产品必须实现的操作。abstractmethod强制子类实现其装饰的方法
""" @abstractmethod
def operation(self) -> str:
pass """
具体的产品提供了产品接口的各种实现。
""" class ConcreteProduct1(Product):
def operation(self) -> str:
return "{Result from ConcreteProduct1}" class ConcreteProduct2(Product):
def operation(self) -> str:
return "{Result from ConcreteProduct2}" def client_code(creator: Creator) -> None:
"""
客户端和具体生产者绑定,就可以获得不同的产品,不用关心具体的创建者是谁
""" print(f"client_code不在乎具体创建者\n"
f"{creator.some_operation()}", end="") if __name__ == "__main__":
print("ConcreteCreator1")
client_code(ConcreteCreator1())
print("\n") print("ConcreteCreator2")
client_code(ConcreteCreator2())

Product 产品声明接口,创建者及其子类生成的所有对象都通用

Concrete ProductA/B是产品接口的不同实现

Creator 创建者声明工厂方法,此方法返回的类型必须与产品接口匹配,可以将工厂方法声明为抽象方法,强制其子类必须实现自己的方法

ConcreteCreatorA/B 重写工厂方法,以便返回不同的产品

有哪些场景适合简单工厂模式呢?

在处理大型的资源密集型对象(例如数据库连接,文件系统和网络资源)时

事先不知道代码应使用的对象的确切类型和依赖关系时

要为库或框架的用户提供扩展其内部组件的方法时

想通过重用现有对象而不是每次都重建它们来节省系统资源时

优缺点:

优点:

可以避免创建者与具体产品之间的紧密耦合。

符合单一责任原则

符合开放/封闭原则,不破坏现有客户端代码,从而增加产品

缺点:

引入许多新的子类来实现该模式,因此代码可能变得更加复杂

作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

大话设计模式Python实现-简单工厂模式的更多相关文章

  1. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  2. 大话设计模式Python实现- 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...

  3. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  4. python实现简单工厂模式

    python实现简单工厂模式 模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工 ...

  5. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  6. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  7. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  8. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  9. IOS设计模式浅析之简单工厂模式(SimpleFactory)

    概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...

随机推荐

  1. C#中的一些对话框问题处理

    1. 对于打开文件对话框处理 #region 打开文件对话框 string StrPath; OpenFileDialog Flag = new OpenFileDialog(); Flag.Mult ...

  2. Web Api全局预防Xss攻击

    本文转载自https://www.cnblogs.com/ruanyifeng/p/4739807.html.对第二种过滤方法的代码进行了一些修改和注释,记录一下免得以后忘了.已经测试过,应该可以直接 ...

  3. UWP使用Microsoft.Data.Sqlite的记录

    我在UWP中使用SQLite数据库时,并没有使用网上的SQLite for Universal App Platform方案,而使用了Microsoft和SQLite社区一起维护的Microsoft. ...

  4. 50本.NTE、C#相关技术书籍免费下载

    场景 近期囤积了一大批编程教程和电子书资料.至于视频教程,我一般是看完之后整理成相应的博客进行记录,一般不会再云盘中进行存取,因为很占空间. 至于电子书资料,很多,就是得一点点整理归纳. 近期我的公众 ...

  5. 关于css中布局遇到的一些问题

    现在本人初学网页布局经常遇到一些布局问题比如图片错位. 遇到的问题以及解决方案如下 行内元素有缝隙 块级元素没有缝隙 行内块元素中间会有小缝隙    常见的解决办法就是浮动

  6. Unix/Linux/Mac os下 文件互传

    说起文件互传,就不得不提命令scp. 他是Secure copy的缩写,使用ssh连接和加密方式, 如果两台机器之间配置了ssh免密登录, 那在使用scp的时候可以不用输入密码.  scp 和 cp ...

  7. python通过连接池连接redis,操作redis队列

    在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...

  8. jar 冲突、class 冲突的检测脚本

    思路很简单,解开war包,解开 jar 包,发现有同名 package.class 就报出来,不管是否“兼容” .. import zipfile import io from collections ...

  9. tcpdump 介绍

    tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具.熟练掌握 tcpdump 可以方便我们跟踪解决网络丢包,重传 ...

  10. itextpdf5操作表格

    下面是一些对表格排版的常用方法,是在制作pdf的时候通过查看ipa和一些博客积累下来的. 包括,表格的宽度,对齐方式,表的页眉页脚,前后间距,padding: 单元格对齐方式,线条设置,段落于单元格之 ...