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

目录

抽象工厂模式

建造者模式

单例模式

创建型模式概述


抽象工厂模式

 抽象工厂模式:定义一个工厂类的接口让工厂子类来创建一系列相关或者相互依赖的对象。相比工厂方法模式,抽象工厂模式中的每一个具体工厂都生产一套产品。下面是生产厂商生产一部手机的例子:生产一部手机如果说只需要手机壳、CPU和操作系统这三个类对象,其中每个类对象都有不同的种类。对每个具体工厂,分别生产一部手机需要的三个对象。通过例子来加深理解:

from abc import ABCMeta, abstractmethod# ------抽象的产品------
class PhoneShell(metaclass=ABCMeta):@abstractmethoddef show_shell(self):passclass PhoneCPU(metaclass=ABCMeta):@abstractmethoddef show_cpu(self):passclass PhoneOS(metaclass=ABCMeta):@abstractmethoddef show_os(self):pass# ------具体的产品------
class SmallShell(PhoneShell):def show_shell(self):print('普通手机小手机壳')class BigShell(PhoneShell):def show_shell(self):print('普通手机大手机壳')class AppleShell(PhoneShell):def show_shell(self):print('苹果手机壳')class SnapDragonCPU(PhoneCPU):def show_cpu(self):print('骁龙CPU')class HuaweiCPU(PhoneCPU):def show_cpu(self):print('化为CPU')class AppleCPU(PhoneCPU):def show_cpu(self):print('苹果CPU')class AndroidOS(PhoneOS):def show_os(self):print('IOS系统')class AppleOS(PhoneOS):def show_os(self):print('安卓系统')# ------抽象的工厂------
class PhoneFactory(metaclass=ABCMeta):@abstractmethoddef make_shell(self):pass@abstractmethoddef make_cpu(self):pass@abstractmethoddef make_os(self):pass# ------具体的工厂------
class HuaweiFactory(PhoneFactory):def make_shell(self):return SmallShell()def make_cpu(self):return HuaweiCPU()def make_os(self):return AndroidOS()class AppleFactory(PhoneFactory):def make_shell(self):return AppleShell()def make_cpu(self):return AppleCPU()def make_os(self):return AppleOS()# ------客户端------
class Phone:def __init__(self, shell, cpu, os):self.shell = shellself.cpu = cpuself.os = osdef show_info(self):print('手机信息:')self.shell.show_shell()self.cpu.show_cpu()self.os.show_os()def make_phone(factory):shell = factory.make_shell()cpu = factory.make_cpu()os = factory.make_os()return Phone(shell, cpu, os)p = make_phone(HuaweiFactory())
p.show_info()
"""
手机信息:
普通手机小手机壳
化为CPU
IOS系统
"""

 抽象工厂模式的角色有:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色和客户端。抽象工厂模式的优点是:将客户端和类的具体实现相分离;每个工厂创建了一个完整的产品系列,使得易于交换产品系列;有利于产品的一致性,即产品之间的约束关系。缺点是:难以支持新种类抽象产品

建造者模式

 建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。角色有抽象创建者、具体创建者、指挥者和产品。建造者模式与抽象工厂模式相似,也用来创建复杂的对象。主要区别是 建造者模式着重一步步构造一个复杂对象(控制顺序)。而抽象工厂模式着重于多个系列的产品对象,写个例子来加强理解:

from abc import ABCMeta, abstractmethod# ------产品------
class Player:def __init__(self, face=None, body=None, arms=None, legs=None):self.face = faceself.body = bodyself.arms = armsself.legs = legsdef __str__(self):return '%s,%s,%s,%s' % (self.face, self.body, self.arms, self.legs)# ------抽象建造者------
class PlayerBuilder(metaclass=ABCMeta):@abstractmethoddef build_face(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef build_arms(self):pass@abstractmethoddef build_legs(self):pass# ------具体建造者,隐藏了一个产品的内部结构------
class GirlBuilder(PlayerBuilder):def __init__(self):self.player = Player()def build_face(self):self.player.face = '漂亮的脸蛋'def build_body(self):self.player.body = '苗条的身材'def build_arms(self):self.player.arms = '细细的胳膊'def build_legs(self):self.player.legs = '大长腿'# ------具体建造者,表示代码------
class MonsterBuilder(PlayerBuilder):def __init__(self):self.player = Player()def build_face(self):self.player.face = '绿脸'def build_body(self):self.player.body = '魁梧的身体'def build_arms(self):self.player.arms = '粗壮的胳膊'def build_legs(self):self.player.legs = '粗壮的大腿'# ------指挥者,构造代码(构造代码和表示代码分开),可以对构造过程进行更加精细地控制------
class PlayerDirectory():def builder_player(self, builder):"""隐藏了装配过程:param builder::return:"""builder.build_face()builder.build_body()builder.build_arms()builder.build_legs()return builder.player# ------客户端------
builder = GirlBuilder()
director = PlayerDirectory()
p = director.builder_player(builder)
print(p)  # 漂亮的脸蛋,苗条的身材,细细的胳膊,大长腿

单例模式

单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。优点是对唯一实例的受控访问(只有一个实例),单例相当于全局变量,但防止了命名空间被污染(变量命名不会有冲突)。写个例子来加深理解:

class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass MyClass(Singleton):def __init__(self, a):self.a = ams1 = MyClass(1)
ms2 = MyClass(2)
print(ms1.a, ms2.a)
print(id(ms1), id(ms2))
"""
2 2
139843914173312 139843914173312
"""

如果实例只出现一次,如日志系统中只需要创建一个日志对象(否则两个日志对象同时操作一个文件就会造成操作冲突);数据库连接池只需要创建一个对象来操作数据库(否则增加系统开销,浪费系统资源);操作系统只需要创建一个文件系统对象来操作文件系统。

创建型模式概述

抽象工厂模式和建造者模式相比于简单工厂模式和工厂方法模式而言更加灵活也更加复杂。通常情况下,软件设计以简单工厂模式或工厂方法模式开始,当发现设计需要更大的灵活性的时候,则向更加复杂的设计模式演化。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode扩展连接虚拟机MySQL数据库

在虚拟机安装MySQL vscode通过ssh远程登录Ubuntu 在vscode终端运行以下命令。 sudo apt-get install mysql-server-5.7 用以下命令确认MySQL是否安装完成。 sudo mysql MySQL安装成功。 在VSCode安装SQL扩展 扩展名:MySQL Shell for VS Code。 安装完成后&am…

【2025】智慧居家养老服务平台的设计与实现、基于AI的居家养老服务平台、居家养老服务平台开发、智慧养老服务平台设计

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

55.【C语言】字符函数和字符串函数(strstr函数)

11.strstr函数 *简单使用 strstr: string string cplusplus的介绍 点我跳转 翻译: 函数 strstr const char * strstr ( const char * str1, const char * str2 ); 或另一个版本char * strstr ( char * str1, const char * str2 ); 寻找子字符串 返回指向第一次出现在字…

从零开始学PostgreSQL (十四):高级功能

目录 1. 简介 2. 视图 3. 外键 4. 事务 5. 窗口函数 6. 继承 7. 结论 简介 PostgreSQL是一个强大且开源的关系型数据库管理系统,以其稳定性、功能丰富性和对SQL标准的广泛支持而闻名。它不仅提供了传统的关系型数据库功能,如事务处理、外键约束和视图&am…

CISP-PTE CMS sqlgun靶场

sql靶场有个搜索框先点一下go,有回显说明存在漏洞 有个xss 然后在这里尝试sql注入 输入 -1 union select 1,2,3# 有回显可以查看数据库 然后查询数据库,用户 查询数据库的表名 查询它的数据这里admin用户的密码是md5加密 去解密看看 然后扫描ip目录发…

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 …

03-Mac系统PyCharm主题设置

目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavi…

物理感知扩散的 3D 分子生成模型 - PIDiff 评测

PIDiff 是一个针对蛋白质口袋特异性的、物理感知扩散的 3D 分子生成模型,通过考虑蛋白质-配体结合的物理化学原理来生成分子,在原理上,生成的分子可以实现蛋白-小分子的自由能最小。 一、背景介绍 PIDiff 来源于延世大学计算机科学系的 Sang…

Git 原理(提交对象)(结合图与案例)

Git 原理(提交对象) 这一块主要讲述下 Git 的原理。 在进行提交操作时,Git 会保存一个提交对象(commit object): 该提交对象会包含一个指向暂存内容快照的指针; 该提交对象还包含了作者的姓…

Java | Leetcode Java题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; class Solution {public boolean canCross(int[] stones) {int n stones.length;boolean[][] dp new boolean[n][n];dp[0][0] true;for (int i 1; i < n; i) {if (stones[i] - stones[i - 1] > i) {return false;}}for (int i 1…

HAL库学习梳理——UART

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关UART课程知识和应用做一个梳理。 省流&#xff1a; uint8_t byteNumber 0x5a;uint8_t byteArray[] {0,1,2,3,4,5};char ch a;char *str "Hello word";HAL_UART_Transmit(&huart1,&by…

Python 课程15-PyTorch

前言 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 开发&#xff0c;广泛应用于学术研究和工业领域。与 TensorFlow 类似&#xff0c;PyTorch 提供了强大的工具用于构建和训练深度学习模型。PyTorch 的动态计算图和灵活的 API 使得它特别适合研究和实验。它还支持…

springboot 项目获取 yaml/yml (或 properties)配置文件信息

文章目录 springboot 项目获取配置文件信息前言1、 Autowired 注入 Environment类2、基础用法&#xff0c;使用Value注解直接注入配置信息3、进阶方法&#xff08;推荐使用&#xff09;拓展&#xff1a;springboot 集成配置中心 - 以 Apollo 为例 springboot 项目获取配置文件信…

【Elasticsearch系列二】安装 Kibana

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【STL】pair 与 map:基础、操作与应用

C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具&#xff0c;广泛应用于存储和处理关联数据。在本文中&#xff0c;我们将详细介绍 pair 与 map 的相关操作&#xff0c;并结合代码实例为读者提供清晰的理解。 pair&#xff1a;成对数据的…

SQL使用IN进行分组统计时如何将不存在的字段显示为0

这两天被扔过来一个脏活儿&#xff1a;做一个试点运行系统的运营指标统计。 活儿之所以称为“脏”&#xff0c;是因为要统计8家单位共12个项目的指标。而每个项目有3个用户类指标&#xff0c;以及分17个功能模块&#xff0c;每个功能模块又分5个维度的指标。也就是单个项目是1…

服务器数据恢复—Linux操作系统环境下网站数据的恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统服务器上跑了几十个网站&#xff0c;服务器上只有一块SATA硬盘。 服务器故障&#xff1a; 服务器突然宕机&#xff0c;尝试再次启动失败。将硬盘拆下检测&#xff0c;发现存在坏扇区。找当地一家数据恢复公司处理后&#xff…

合宙Air201模组LuatOS:点点鼠标就搞定的FOTA远程升级,你知道吗?

你是不是也经常遇到小伙伴吐槽&#xff1a;开发是个苦差事&#xff01;做项目倒还好&#xff0c;就怕遇到项目升级&#xff0c;那简直让人头大。。。 如果你也有这种困惑&#xff0c;就多了解一下合宙的开发工具&#xff0c;简单实用又高效&#xff0c;甚至只需点点鼠标&#…

水下目标检测数据集 urpc2021

项目背景&#xff1a; 水下目标检测在海洋科学研究、水下考古、海洋资源勘探等多个领域具有重要的应用价值。由于水下环境的复杂性和多变性&#xff0c;传统的人工检测方法存在诸多限制&#xff0c;自动化检测技术的需求日益增加。URPC2021数据集旨在为水下目标检测提供高质量…

Python OpenCV精讲系列 - 高级图像处理技术(七)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…