【python设计模式2】创建型模式1

目录

简单工厂模式

工厂方法模式


简单工厂模式

简单工厂模式不是23中设计模式中的,但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有:工厂角色、抽象产品角色、具体产品角色,通过例子来加深理解:

from abc import ABCMeta, abstractmethod# 抽象产品角色,以什么样的表现去使用
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))# 产品角色
class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 工厂类角色
class PaymentFactory:def ctreate_payment(self, method):if method == 'Alipay':return Alipay()elif method == 'WechatPay':return WechatPay()elif method == 'HuabeiPay':return Alipay(use_huabei=True)else:raise TypeError('No such payment named %s' % method)# 客户端调用。不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例
pf = PaymentFactory()
p = pf.ctreate_payment('HuabeiPay')
p.pay(100)

工厂方法模式

 简单工厂模式只创建一个工厂类,当有新的产品时,需要修改工厂类代码。而 工厂方法模式的每个具体产品对应一个具体的工厂类,不需要修改工厂类代码,并且同时也能满足隐藏对象创建的细节。但是工厂方法模式也是有缺点的,就是 每增加一个具体产品类,就必须增加一个相应的具体方法。        工厂模式方法模式的概念是定义了一个用于创建对象的接口(工厂接口),让子类决定实例化那一个产品类。角色有抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。通过例子来加深理解,每个具体产品对应一个具体的工厂类:

from abc import ABCMeta, abstractmethod# 抽象产品角色
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 具体产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 具体工厂角色
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatPayFactory(PaymentFactory):def create_payment(self):return Alipay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)hfp = HuabeiFactory().create_payment()
hfp.pay(100)  # 花呗支付了100元!

缺点是每增加一个具体产品类,就必须增加一个相应的具体方法:

from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))class BankPay(Payment):def pay(self, money):print("银行支付了%d元!" % (money))# 创建产品的工厂类的接口
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 工厂类
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class WechatPayPayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class HuabeiPayFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)# 新增加银行支付的工厂类
class BankPayFactory(PaymentFactory):def create_payment(self):return BankPay()bfp = BankPayFactory().create_payment()
bfp.pay(100)  # 银行支付了100元!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143070.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Redis(redis基础,SpringCache,SpringDataRedis)

文章目录 前言一、Redis基础1. Redis简介2. Redis下载与安装3. Redis服务启动与停止3 Redis数据类型4. Redis常用命令5. 扩展数据类型 二、在Java中操作Redis1. Spring Data Redis的使用1.1. 介绍1.2. 环境搭建1.3. 编写配置类,创建RedisTemplate对象1.4. 通过Redis…

Linux入门学习:git

文章目录 1. 创建仓库2. 仓库克隆3. 上传文件4. 相关问题4.1 git进程阻塞4.2 git log4.3 上传的三个步骤在做什么 本文介绍如何在Linux操作系统下简单使用git,对自己的代码进行云端保存。 1. 创建仓库 🔹这里演示gitee的仓库创建。 2. 仓库克隆 &…

Zookeeper 3.8.4 安装和参数解析

安装 zookeeper 之前必须先安装 JDK,有关Linux环境JDK可以参考我以前写的博文 1、关于Linux服务器配置java环境遇到的问题 2、Linux环境安装openJDK 3、Centos7.3云服务器上安装Nginx、MySQL、JDK、Tomcat环境 文章目录 1. zookeeper 安装2. 参数解析 1. zookeeper …

VScode快速配置c++(菜鸟版)

1.vscode是什么 Visual Stdio Code简称VS Code,是一款跨平台的、免费且开源的现代轻量级代码编辑器,支持几乎 主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性,也拥有对git的开箱即…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

如何通过 4 种方法恢复 Mac 上删除/未保存的 Excel 文件

您花了数小时在 MacBook 上处理 Excel 工作簿,但现在它不见了。或者,当您退出 Excel 文件时,您无意中选择了“不保存”。这是否意味着您的所有努力都白费了?本文系统地解释了如何在 Mac 上恢复丢失的 Excel 文件。使用我们的 4 种…

如何在Android上实现RTSP服务器

技术背景 在Android上实现RTSP服务器确实是一个不太常见的需求,因为Android平台主要是为客户端应用设计的。在一些内网场景下,我们更希望把安卓终端或开发板,作为一个IPC(网络摄像机)一样,对外提供个拉流的…

Linux学习记录十四----------线程的创建和回收

文章目录 五、Linux线程1.守护进程1.1.守护进程的特点1.2.进程组1.3会话1.4创建守护进程模型 2.线程的概念3.线程的创建及相关函数3.1.创建线程‐‐pthread_create3.2.单个线程退出 --pthread_exit3.3.阻塞等待线程退出,获取线程退出状态--pthread_join3.4.线程分离…

无限制使用OpenAI最新o1-mini、o1-preview模型:经济高效的AI推理模型

OpenAI 最新推出的 o1 模型是该公司推理模型家族的首位成员,它通过创新的“思维链”训练模式,显著提升了逻辑推理和问题解决的能力。o1 模型在编程竞赛问题、数学奥林匹克资格赛以及物理、生物和化学问题的基准测试中表现出色,甚至在某些领域…

学成在线练习(HTML+CSS)

准备工作 项目目录 内部包含当前网站的所有素材,包含 HTML、CSS、图片、JavaScript等等 1.由于元素具有一些默认样式,可能是我们写网页过程中根本不需要的,所有我们可以在写代码之前就将其清除 base.css /* 基础公共样式:清除…

Tongweb7启动的时候显示要输入java参数(by lqw)

问题描述: 启动tongweb7的时候,提示要输入java参数,如下图所示: 原因: tongweb安装目录bin目录下的external.vmoptions文件改动,在# 符号后加多了一个空格。 external.vmoptions记录的是启动参数&#xf…

【读书】原则

后面的 太长了,而且太多了 我看作者 49年的 0多岁的老人的谆谆教诲 太多了 一下子吃不消 分为 生活原则 和 工作原则 倡导 人要以 原则而活 要做到极度透明 极度求真和极度透明:在软件开发中,对事实的执着追求和对信息的透明度是至关重要的。…

论文阅读 - SELF-REFINE: Iterative Refinement with Self-Feedback

https://arxiv.org/pdf/2303.17651 目录 Abstract Introduction 2 Iterative Refinement with SELF-REFINE Evaluation 3.1 Instantiating SELF-REFINE 3.2 Metrics 3.3 Results Abstract 与人类一样,大型语言模型(LLMs)并非总能在首次…

【刷题日记】螺旋矩阵

54. 螺旋矩阵 这个是一道模拟题,但我记得我大一第一次做这道题的时候真的就是纯按步骤模拟,没有对代码就行优化,导致代码写的很臃肿。 有这么几个地方可以改进。 看题目可以知道最终的结果一定是rows*cols个结点,所以只需要遍历rows*cols次…

java十进制码、六进制码和字符码的转换

一、字符转换为ASCII码: int i(int)1; 二、ASCII码转换为字符: char ch (char)40; 三、十六进制码转换为字符: char charValue (char)\u0040; package week3;public class check_point4_8 {public static void main(String[] args) {S…

Java 性能调优:优化 GC 线程设置

垃圾回收器使用一组称为 GC 线程的线程来执行回收工作。有时 JVM 可能会分配过多或过少的 GC 线程。本文将讨论 JVM 为什么会出现这种情况、其影响以及可能的解决方案。 1 咋查找应用程序的 GC 线程数量 进行线程转储分析来确定应用程序的 GC 线程数量: 从生产服…

【算法思想·二叉搜索树】基操篇

本文参考labuladong算法笔记[二叉搜索树心法(基操篇) | labuladong 的算法笔记] 1、概述 我们前文 东哥带你刷二叉搜索树(特性篇) 介绍了 BST 的基本特性,还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目&am…

MathType7.9绿色和谐版激活补丁包下载

MathType7.9中文版:让你的数学公式更酷炫✨ 嘿,亲爱的数学迷们!今天我要给你们安利一款超级炫酷的数学公式编辑器——MathType7.9中文版。这款软件不仅能让你轻松输入各种复杂的数学公式,还能让你的公式看起来更加酷炫哦&#xf…

Java项目——苍穹外卖(二)

Redis 简介 Redis是一个基于内存的key-value结构数据库 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 基础操作 启动 在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl…

【嘉立创EDA】画PCB板中为什么要两面铺铜为GND,不能一面GND一面VCC吗?

在新手画板子铺铜时,经常会铺一面GND一面VCC。但一般情况下我们不会这样铺铜。下面将详细分析为什么要两面铺铜为GND,而不是一面GND一面VCC的原因: 提高散热能力 金属导热性:金属具有良好的导热性,铺铜可以有效分散PCB…