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

一、简单工厂模式

什么是简单工厂模式?

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

"""
简单工厂模式
"""

from abc import ABCMeta, abstractmethod


class My_abc(metaclass=ABCMeta):
    @abstractmethod
    def test(self):
        pass


class 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:
    @staticmethod
    def 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, abstractmethod


class EleCar(metaclass=ABCMeta):
    """
    新能源车产品的基类
    """
    @abstractmethod
    def run(self, money):
        pass


class MiCar(EleCar):
    """
    具体的产品
    """
    def run(self):
        print("小米,启动!")


class TslCar(EleCar):
    """
    具体的产品
    """
    def run(self):
        print("特斯拉,启动!")


class CreateCar(metaclass=ABCMeta):
    """
    抽象出来的工厂基类
    """
    @abstractmethod
    def create(self):
        pass


class 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):
    @abstractmethod
    def select_shell(self):
        pass


# CPU处理器
class CPU(metaclass=ABCMeta):
    @abstractmethod
    def select_cpu(self):
        pass


# OS系统
class OS(metaclass=ABCMeta):
    @abstractmethod
    def select_os(self):
        pass


class 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):
    @abstractmethod
    def make_shell(self):
        pass

    @abstractmethod
    def make_cpu(self):
        pass

    @abstractmethod
    def make_os(self):
        pass


class 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 = shell
        self.cpu = cpu
        self.os = os

    def 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.mfbz.cn/a/556112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE4 拍摄、保存并浏览相册

效果: 1.新建CameraActor类 2.修改截图保存路径 3.编写BP_Camera蓝图 注意路径 Save Image函数要在执行拍照和BeginPlay事件执行一次 按钮执行拍摄事件 3.编写UMG蓝图 技巧:让Index加1、减1循环赋值 4.把BP_Camera挂在玩家上

《QT实用小工具·三十》基于QT开发的访客管理平台demo

1、概述 源码放在文章末尾 该项目为访客管理平台demo,包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下: #ifndef QTHELPER_H #define QTHELPER_H#include "head.h"class QtHelper { public://获取所有屏幕区域…

从Linux角度具体理解程序翻译过程-----预处理、编译、汇编、链接

前言: 在C语言中,我们知道程序从我们所写的代码到可执行执行的过程中经历了以下过程 1.预处理 2.编译 3.汇编 4.链接 可以通过下图来理解 翻译过程 1.预处理 该过程主要进行以下操作: (1)头文件的包含 (2)define定义符号的替换&#xff…

怎样实现opc采集数据后传给web后端

现在很多老工厂要进行数字化改造,现场生产的各种数据需要传到web后端,很多工厂现场原有的自动监控系统已经采集了现场的各种数据,只是没有形成联网。如果前端自动化系统全部废除,重新做数字化控制系统,成本投入太大&am…

docker服务无法启动

背景:断电重启经常会导致磁盘io错误,甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘,但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一: Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

Java入门(JDK安装)

安装 JDK 下载 Java Downloads | Oracle 安装 下一步直接安装安装过程中,需要确定自己的安装位置 参考:D:\Java\jdk1.8.0_281_x64 演示位置 校验 终端输入 java -version 配置 1)删除默认 javapath 默认情况下,可以在cm…

【C++题解】1607. 两位数运算

问题:1607. 两位数运算 类型:基本运算、拆位求解 题目描述: 小丽在编程课上学会了拆位运算,她已经可以拆出一个两位整数的十位和个位了,她想知道这个整数的十位 / 个位的结果是多少,请编程帮她实现&#…

VulnHub靶机 DC-5 打靶 渗透测试详情过程

VulnHub靶机 DC-5 打靶 详细渗透测试过程 目录 VulnHub靶机 DC-5 打靶 详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描目录爆破文件包含getshell反弹shell提权 一、将靶机导入到虚拟机当中 靶机地址: https://download.vulnhub.com/dc/…

【论文阅读】YOLO-World | 开集目标检测

Date:2024.02.22,Tencent AI Lab,华中科技大学Paper:https://arxiv.org/pdf/2401.17270.pdfGithub:https://github.com/AILab-CVC/YOLO-World 论文解决的问题: 通过视觉语言建模和大规模数据集上的预训练来…

HTTP/HTTPS详解

HTTP/HTTPS详解 1. HTTP1.1 HTTP基础知识1.2 HTTP建立和断开连接 2. HTTPS 1. HTTP 1.1 HTTP基础知识 HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用 于从WWW服务器传输超文本到本…

学习一下选择排序,快速排序

1.选择排序 我们可以根据这动图看到,就是在这个数组里面我们选出最小的放进第一个位置,然后再选除了第一个位置最小的,剩下的数里面最小的放到第二个位置,是不是非常简单呢。 void SelectSort2(int* arr, int n) {int begin 0;…

Stable Diffusion 3 API 发布!超越Midjourney v6和DALL-E 3

Stable Diffusion 3 于 2 月首次宣布作为预览版发布。而今天,StabilityAI 正式推出了 Stable Diffusion 3 和 Stable Diffusion 3 Turbo API 的API接口服务。 Stability AI 称仍在持续改进该模型,并没有说明发布日期。模型还没发布,但API先来…

安装importlib_resources库的方法最终解答!_Python库

安装Python库importlib_resources 我的环境:Window10,Python3.7,Anaconda3,Pycharm2023.1.3 importlib_resources importlib_resources是一个用于访问Python包中非代码资源(如文本、图片等)的库&#xff…

neo4j使用详解(终章、neo4j的java driver使用模板及工具类——<可用于生产>)

Neo4j系列导航: neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 neo4j java Driver等更多 1. 简介 本文主要是java使用neo4j driver操作neo4j的模板项目及非常有用的工具类,主要包括: 图…

yolov7模型输出层预测方法解读

本文从代码的角度分析模型训练阶段输出层的预测包括以下几个方面: 标注数据(下文统称targets)的正样本分配策略,代码实现位于find_3_positive。候选框的生成,会介绍输出层的预测值、GT、grid、 anchor之间的联系损失函…

【原创】springboot+mysql疫苗预约管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(多主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大…

ollama大语言模型

查看已经安装的大语言模型 ollama list运行大语言模型 ollama run llama2:latest

【EI会议征稿通知】2024年图像处理、机器学习与模式识别国际学术会议(IPMLP 2024)

2024年图像处理、机器学习与模式识别国际学术会议(IPMLP 2024) 2024 International Conference on Image Processing, Machine Learning and Pattern Recognition 重要信息 大会官网:www.ipmlp.net(点击参会/投稿/了解会议详情)…

Elasticsearch:简化 KNN 搜索

作者:来自 Elastic Panagiotis Bailis 在这篇博客文章中,我们将深入探讨我们为了使 KNN 搜索的入门体验变得更加简单而做出的努力! 向量搜索 向量搜索通过在 Elasticsearch 中引入一种新的专有的 KNN 搜索类型,已经可以使用一段…
最新文章