【Python笔记-设计模式】抽象工厂模式

一、说明

(一) 解决问题

抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。

(二) 使用场景

系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。

例如:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。

而客户需要的是相同风格的各类产品

二、结构

  1. 抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。
  2. 具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代) 都必须实现相应的抽象产品 (椅子/沙发)。
  3. 抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
  4. 具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体, 且仅创建此种产品变体。
  5. 尽管具体工厂会对具体产品进行初始化, 其构建方法签名必须返回相应的抽象产品。 这样, 使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。 客户端 (Client) 只需通过抽象接口调用工厂和产品对象, 就能与任何具体工厂/产品变体交互。

三、伪代码

__doc__ = """
抽象工厂模式例:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。
"""from abc import ABC, abstractmethodclass AbstractFactory(ABC):"""抽象工厂基类提供创建三种家具抽象方法"""@abstractmethoddef create_chair(self):pass@abstractmethoddef create_sofa(self):pass@abstractmethoddef create_coffee_table(self):passclass ModernFactory(AbstractFactory):"""具体工厂基类实现创建现代风格家具的方法"""def create_chair(self):return ModernChair()def create_sofa(self):return ModernSofa()def create_coffee_table(self):return ModernCoffeeTable()class VictorianFactory(AbstractFactory):"""具体工厂基类实现创建维多利亚风格家具的方法"""def create_chair(self):return VictorianChair()def create_sofa(self):return VictorianSofa()def create_coffee_table(self):return VictorianCoffeeTable()class AbstractProduct(ABC):"""抽象产品基类提供使用抽象方法"""@abstractmethoddef use(self):passclass ModernChair(AbstractProduct):"""具体产品"""def use(self):print("现代风格椅子")class ModernSofa(AbstractProduct):"""具体产品"""def use(self):print("现代风格沙发")class ModernCoffeeTable(AbstractProduct):"""具体产品"""def use(self):print("现代风格咖啡桌")class VictorianChair(AbstractProduct):"""具体产品"""def use(self):print("维多利亚风格椅子")class VictorianSofa(AbstractProduct):"""具体产品"""def use(self):print("维多利亚风格沙发")class VictorianCoffeeTable(AbstractProduct):"""具体产品"""def use(self):print("维多利亚风格咖啡桌")def client_code(factory):"""客户端"""chair = factory.create_chair()sofa = factory.create_sofa()coffee_table = factory.create_coffee_table()chair.use()sofa.use()coffee_table.use()if __name__ == '__main__':"""Client: Testing client code with the first factory type:现代风格椅子现代风格沙发现代风格咖啡桌Client: Testing the same client code with the second factory type:维多利亚风格椅子维多利亚风格沙发维多利亚风格咖啡桌"""print("Client: Testing client code with the first factory type:")factory1 = ModernFactory()client_code(factory1)print()print("Client: Testing the same client code with the second factory type:")factory2 = VictorianFactory()client_code(factory2)

四、优缺点

优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。

缺点

  • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

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

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

相关文章

SQL注入的剩余类型

除了联合查询注入,报错注入,盲注注入 sql注入还有以下几类🦹🦹🦹🦹🦹 开始填坑 1.UA注入 原理:有些网站会把用户的UA信息写入数据库,用来收集和统计用户…

elementui的el-table自定义控制展开事件,实现“展开”“收起”的切换(两种效果)【超级完整式代码】

第一种&#xff1a;多行点击展开其他行不收起 先看效果图 直接上代码 【核心代码添加标注简单易懂】 <el-tableref"multipleTable":data"smsLogList.slice((currentPage - 1) * pageSize_, currentPage * pageSize_)"tooltip-effect"dark"st…

Python拼接字符串

在Python编程中&#xff0c;字符串拼接是一项常见的操作&#xff0c;它可以用于将多个字符串连接起来形成一个新的字符串&#xff0c;是处理文本数据和字符串操作的基本技巧之一。 1. 使用""运算符进行字符串拼接 最常见的字符串拼接方法是使用""运算符&…

专业130+总分390+第二名中国海洋大学946信号与系统考研经验电子信息通信

今年专业946信号与系统130&#xff0c;总分390&#xff0c;专业排名第2顺利上岸中国海洋大学&#xff0c;总结一下自己的复习经验希望对大家复习有所帮助&#xff0c;每个人的学习习惯不同&#xff0c;大家要对自己有信心&#xff0c;借鉴加上自己整合&#xff0c;属于自己的才…

在Windows上安装与配置Apache服务并结合内网穿透工具实现公网远程访问本地内网服务

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

Git 教程 | 将本地修改后的文件推送到 Github 指定远程分支上

Git 是一种分布式版本控制系统&#xff0c;用于敏捷高效地处理任何大小的项目。它是由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开源版本控制软件。Git 的本地克隆就是一个完整的版本控制存储库&#xff0c;无论脱机还是远程都能轻松工作。开发人员会在本地提交其工…

【JavaScript 基础入门】01 编程语言和计算机基础

编程语言和计算机基础 目录 编程语言和计算机基础1 - 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别1.6 总结 2 - 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1 - 编程语言 1.1 编程 编程&#xff1a; 就是让计算…

Qt线程高级应用

一般我们在用Qt开发时&#xff0c;把耗时操作放在线程中执行&#xff0c;避免卡界面&#xff0c;Qt的线程使用有两种方式&#xff0c;一种是继承QThread&#xff0c;一种是moveToThread的方式&#xff0c;以及QtConcurrent方式 首先我们来看第一种&#xff1a; #ifndef WORKER…

上推加载更多组件

本组件使用的是TaroReact 实现的 &#xff0c;具体代码如下 一共分为tsx和less文件 //index.tsx /** RefreshLoading* description 上推加载更多组件* param loading boolean* param style* returns*/import { View } from "tarojs/components"; import React, { FC…

DELL R740 两个raid10安装centos7.9

DELL R740 两个raid10安装centos7.9 服务器硬件配置&#xff1a; DELL R740&#xff1a;R740/4214R (12C,100W,2.4GHz)*2/128G(32G DDR4 RDIMM)*4 /600G SAS 10K *41.2T SAS 转速10K*4/H750 &#xff08;8G 缓存&#xff09;/750W *2/iDRAC9 要求&#xff1a;600G*4&#xf…

HTML5+CSS3小实例:创意修剪路径图像悬停效果

实例:创意修剪路径图像悬停效果 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge&qu…

安卓手机日程不响铃或弹窗提醒怎么设置?

在庞大的安卓手机用户群体中&#xff0c;诸多手机品牌如小米、OPPO、vivo、荣耀等都为用户提供了丰富的功能和便捷的体验。然而&#xff0c;有时候我们在手机日历中设置了提醒时间&#xff0c;却发现安卓手机的日程提醒并没有如期响铃或弹窗&#xff0c;这着实令人头疼。那么安…