设计模式之工厂模式(python3)

一、简单工厂模式

什么是简单工厂模式?

        专门定义一个类来负责创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常具有共同的父类,这个模式叫简单工厂模式(Simple Factory Pattern)。

"""
简单工厂模式
"""from abc import ABCMeta, abstractmethodclass My_abc(metaclass=ABCMeta):@abstractmethoddef test(self):passclass My_class1(My_abc):def test(self):return "My_class1_test"class My_class2(My_abc):def test(self):return "My_class2_test"class fac:@staticmethoddef fac_func(param):if param == "1":return My_class1()elif param == "2":return My_class2()else:raise "参数错误"if __name__ == "__main__":a1 = fac.fac_func("1")a2 = fac.fac_func("2")print(a1.test())print(a2.test())

二、工厂方法模式

        由于简单工厂模式不符合"开闭原则",所以在简单工厂模式之上升级出了工厂方法模式。

什么是工厂方法模式?

        定义一个创建对象(实例化对象)的接口,让子类来决定创建哪个类的实例。工厂方法使一个类的实例化延迟到其子类。

"""
工厂方法模式
"""
from abc import ABCMeta, abstractmethodclass EleCar(metaclass=ABCMeta):"""新能源车产品的基类"""@abstractmethoddef run(self, money):passclass MiCar(EleCar):"""具体的产品"""def run(self):print("小米,启动!")class TslCar(EleCar):"""具体的产品"""def run(self):print("特斯拉,启动!")class CreateCar(metaclass=ABCMeta):"""抽象出来的工厂基类"""@abstractmethoddef create(self):passclass MiFactory(CreateCar):"""负责创建具体产品的工厂子类"""def create(self):return MiCar()class TslFactory(CreateCar):"""负责创建具体产品的工厂子类"""def create(self):return TslCar()pf = MiFactory()
p = pf.create()
p.run()

三、抽象工厂模式

不太懂!

from abc import ABCMeta, abstractmethod# 手机壳
class Shell(metaclass=ABCMeta):@abstractmethoddef select_shell(self):pass# CPU处理器
class CPU(metaclass=ABCMeta):@abstractmethoddef select_cpu(self):pass# OS系统
class OS(metaclass=ABCMeta):@abstractmethoddef select_os(self):passclass MiShell(Shell):def select_shell(self):print("小米手机壳")class IPhoneShell(Shell):def select_shell(self):print("苹果手机壳")class MiCPU(CPU):def select_cpu(self):print("小米CPU")class IPhoneCPU(CPU):def select_cpu(self):print("苹果CPU")class MiOS(OS):def select_os(self):print("小米系统")class IPhoneOS(OS):def select_os(self):print("苹果系统")class CreatePhone(metaclass=ABCMeta):@abstractmethoddef make_shell(self):pass@abstractmethoddef make_cpu(self):pass@abstractmethoddef make_os(self):passclass CreateMi(CreatePhone):def make_shell(self):return MiShell()def make_cpu(self):return MiCPU()def make_os(self):return MiOS()class CreateIPhone(CreatePhone):def make_shell(self):return IPhoneShell()def make_cpu(self):return IPhoneCPU()def make_os(self):return IPhoneOS()class Phone:def __init__(self, shell, cpu, os):self.shell = shellself.cpu = cpuself.os = osdef show_info(self):print("手机信息:")self.shell.select_shell()self.cpu.select_cpu()self.os.select_os()def make_phone(factory):shell = factory.make_shell()cpu = factory.make_cpu()os = factory.make_os()return Phone(shell, cpu, os)phone_type = CreateMi()
phone = make_phone(phone_type)
phone.show_info()

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

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

相关文章

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue Blueprint(user, __name__)# 首页 可以写两个路由,都是访问同一个函数 blue.route(/) b…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于RIME-SVR霜冰算法优化支持向量机的数…

多线程八股文常见面试题总结(一)

java多线程基本面试题 目录 前言 一、创建多线程的方式有哪些&#xff1f; 二、runable接口和callable接口有什么区别&#xff1f; 三、run和start有什么区别&#xff1f; 四、线程的状态之间是如何变化的&#xff1f; 五、新建T1、T2、T3如何保证他们的顺序执行&#xff1f; …

MySQL优化慢SQL的6种方式

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 优化方法 1.避免查询不必要的列 2.分页优化 3.索引优化 4.JOIN优化 5.排序优化 6.UNION 优化…

无线网络2.4和5G的区别

无线网络2.4和5的区别 无线网络2.4GHz和5GHz的主要区别在于频率、覆盖范围、传输速度、干扰能力和穿透性。以下是详细介绍&#xff1a;12 频率不同。2.4GHz的频率较低&#xff0c;而5GHz的频率较高。频率越低&#xff0c;信号在传播过程中的损失越小&#xff0c;因此覆盖范围…

如何在 Ubuntu 14.04 上配置一个生产就绪的 Mesosphere 集群

简介 Mesosphere 是一个系统&#xff0c;它结合了许多组件&#xff0c;可以在现有操作系统层之上有效地管理服务器集群和高可用部署。与 CoreOS 等系统不同&#xff0c;Mesosphere 不是一个专门的操作系统&#xff0c;而是一组软件包。 在本指南中&#xff0c;我们将介绍如何…

linux学习:文件属性

在操作文件的时候&#xff0c;经常需要获取文件的属性&#xff0c;比如类型、权限、大小、所有者等等&#xff0c; 这些信息对于比如文件的传输、管理等是必不可少的&#xff0c;而这些信息 这三个函数的功能完全一样&#xff0c;区别是&#xff1a;stat( )参数是一个文件的名字…

网络篇05 | 应用层 http/https

网络篇05 | 应用层 http/https 01 HTTP请求报文协议&#xff08;Request&#xff09;1&#xff09;Request简述2&#xff09;请求行&#xff08;首行&#xff09;3&#xff09;请求头&#xff08;Request Headers&#xff09;4&#xff09;空行5&#xff09;正文&#xff08;Re…

【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets 4.1 Clock and clock enables 时钟和时钟使能 Cortex-R52处理器具有一个单一的时钟&#xff0c;驱动着所有的触发器和RAM。各种输入&#xff0c;包括复位输入&#xff0c;都有同步逻辑使它们可以与处理器时钟异步操…

appium控制手机一直从下往上滑动

用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说&#xff0c;它通过WebDriverWait和expected_conditions等待元素出现&#xff0c;然后使用ActionChains移动到该元素并执行滚动动作。在setUp中&#xff0c;它初始化了Appium的WebDriver和c…

Android中的Zygote进程介绍

在Android系统中&#xff0c;Zygote是一个特殊的进程&#xff0c;主要负责孵化&#xff08;fork&#xff09;新的应用进程&#xff0c;从而加速应用的启动过程。Zygote进程是系统启动过程中创建的第一个进程&#xff0c;它会在系统启动时被初始化并一直运行在后台。 以下是Zyg…

如何在MacOS上使用OpenHarmony SDK交叉编译?

本文以cJSON三方库为例介绍如何通过OpenHarmony的SDK在Mac平台进行交叉编译。 环境准备 SDK准备 我们可以通过 openHarmony SDK 官方发布渠道下载对应mac版本的SDK&#xff0c;当前OpenHarmony MAC版本的SDK有2种&#xff0c;一种是x86架构&#xff0c;另一种是arm64&#x…

【HTML】HTML简介

参考资料&#xff1a;https://html.spec.whatwg.org/#introduction 在最初的五年&#xff08;1990-1995&#xff09;中&#xff0c;HTML经历了一系列修订和扩展&#xff0c;最初主要由欧洲核子研究组织&#xff08;CERN&#xff09;托管&#xff0c;随后由互联网工程任务组&am…

Anaconda在Ubuntu下的安装与简单使用

一、参考资料 ubuntu16.04下安装&配置anacondatensorflow新手教程 二、安装Anaconda 下载 Miniconda镜像1 or Miniconda镜像2 # 下载 wget Miniconda3-py39_4.10.3-Linux-x86_64.sh# 安装 bash Miniconda3-py39_4.10.3-Linux-x86_64.sh一路yes 安装过程中的选项 Do you …

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…

Hudi-ubuntu环境搭建

hudi-ubuntu环境搭建 运行 1.编译Hudi #1.把maven安装包上传到服务器 # 官网下载安装包 https://archive.apache.org/dist/maven/maven-3/ scp -r D:\Users\zh\Desktop\Hudi\compressedPackage\apache-maven-3.6.3-bin.tar.gz zhangheng10.8.4.212:/home/zhangheng/hudi/com…

Spring+SpringMVC的知识总结

一:技术体系架构二:SpringFramework介绍三:Spring loC容器和核心概念3.1 组件和组件管理的概念3.1.1什么是组件:3.1.2:我们的期待3.1.3Spring充当组件管理角色(IOC)3.1.4 Spring优势3.2 Spring Ioc容器和容器实现3.2.1普通和复杂容器3.2.2 SpringIOC的容器介绍3.2.3 Spring IOC…