简单工厂模式(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. DOIS2019大会,腾讯 DevOps 测试中台探秘

    WeTest 导读 腾讯WeTest受邀参加2019年DevOps 国际峰会,由WeTest产品负责人-殷柱伟老师分享了腾讯DevOps测试中台的实践经验与心得, 议题受到了现场听众及行业媒体的关注与 ...

  2. APS系统生产流转方式和批量算法研究

    01.前言 在经济领域,生产型企业是经济的根基,有了生产型企业生产出的各种产品,才有物流.网上购物和金融融资等活动.对于生产型企业,其制造能力是其核心竞争力.如何提升制造能力一直是生产型企业面临的课题 ...

  3. iOS处理含中文的请求链接

    NSString *urlStr = @""; // 将中文URL进行转码 urlStr = [urlStr stringByAddingPercentEscapesUsingEn ...

  4. 从html富文本中提取纯文本

    其实从html富文本中提取纯文本很简单,富文本基本上是使用html标签给文本加上丰富多彩的样式. 所以只需要将富文本字符串中的“<.....>”标签剔除,即可得到纯文本.我们可以使用正则表 ...

  5. scanf的返回值

    参考这个博客,https://blog.csdn.net/sinat_40936062/article/details/84348021 #include<stdio.h> int mai ...

  6. 201777010217-金云馨《面向对象程序设计Java》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. 201871010133-赵永军《面向对象程序设计(java)》第七周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  8. csp 201409-3 字符串匹配

    问题描述: 很简单,判断给定串是否在目标串中出现.分区分大小写和不区分大小写两种情况. csp特点: csp的第三题一般是字符串的处理,c++的string类虽然不好用,但是掌握的话在考试的时候可能能 ...

  9. Vs2012帮助文档安装介绍

    Vs2012的帮助文档:Microsoft Help Viewer.exe,vs2010对应的是1.0,vs2012对应的是2.0,版本号以此类推 与早期的chm格式的msdn帮助文档不同在于: 1. ...

  10. BOI 2003 团伙

    洛谷 P1892 [BOI2003]团伙 洛谷传送门 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋 ...