设计模式 - 工厂

news2025/1/21 4:45:39

文章参考来源

一、概念

创建简单的对象直接 new 一个就完事,但对于创建时需要各种配置的复杂对象例如手机,没有工厂的情况下,用户需要自己处理屏幕、摄像头、处理器等配置,这样用户和手机就耦合在一起了。 

  • 可以使代码结构清晰,有效地封装变化:在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
  • 对调用者屏蔽具体的产品类:如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度:产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

二、简单工厂模式

  • 优点:封装了对象的创建,与业务逻辑解耦。
  • 缺点:每当具体产品数量增加时,都需要对工厂类进行修改,不符合开闭原则且会越来越臃肿。

抽象产品

IProduct

简单工厂创建的多有对象的父类,负责描述所有实例共有的公共接口。

具体产品

ConcreteProduct

简单共厂模式的创建目标。

简单工厂

SimpleFactory

负责创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

2.1 抽象产品 (手机)

interface IPhone {
    fun show()
}

2.2 具体产品(手机A、手机B)

class PhoneA : IPhone {
    override fun show() {
        println("Phone A")
    }
}

class PhoneB : IPhone {
    override fun show() {
        println("Phone B")
    }
}

2.3 简单工厂

enum class PhoneModel { A, B }    //使用枚举,方便对传入的型号做判断

class SimpleFactory {
    companion object {
        fun makePhone(phoneModel: PhoneModel): IPhone = when (phoneModel) {
            PhoneModel.A -> PhoneA()
            PhoneModel.B -> PhoneB()
        }
    }
}

2.4 使用

SimpleFactory.makePhone(PhoneModel.B)

三、工厂方法模式

  • 优点:每当具体产品增加时,只需创建对应的具体工厂即可,对已有代码无修改,符合开闭原则便于扩展。
  • 缺点:具体工厂只能生产一种产品。
抽象产品工厂方法模式所创建的对象的超类型。也是产品对象的共同父类或者共同拥有的接口。
具体产品实现了抽象产品角色所定义的接口。某具体产品由具体工厂创建,他们往往一一对应。
抽象工厂定义了创建抽象产品的方法,任何在模式中创建对象的工厂类都必须实现这个接口。
具体工厂实现抽象工厂接口的具体工厂类,负责生产具体的产品。

3.1 抽象产品(衣服)

interface Icloth {
    fun show()
}

3.2 具体产品(外套、牛仔裤)

class Coat : Icloth {
    override fun show() {
        println("夹克")
    }
}

class Jeans : Icloth {
    override fun show() {
        println("牛仔裤")
    }
}

3.3 抽象工厂

interface Ifactory {
    fun makeCloth(): Icloth
}

3.4 具体工厂(夹克工厂、牛仔裤工厂)

class CoatFactory : Ifactory {
    override fun makeCloth() = Coat()
}

class JeansFactory : Ifactory {
    override fun makeCloth() = Jeans()
}

3.5 使用

val coatFactory = CoatFactory()
val coat = coatFactory.makeCloth()

四、抽象工厂模式

  • 优点:每当具体产品族(这里指阿迪或耐克)增加时,只需要创建对应的具体工厂即可,对已有代码无修改,符合开闭原则便于扩展。
  • 缺点:每当新增

4.1 抽象产品(鞋子、衣服)

interface IShoes {
     fun show()
}

interface ICloth {
     fun show()
}

4.2 具体产品(阿迪鞋子、阿迪衣服、耐克鞋子、耐克衣服)

class AdidasShoes : IShoes {
    override fun show() {
        println("阿迪鞋子")
    }
}

class AdidasCloth : ICloth {
    override fun show() {
        println("阿迪衣服")
    }
}

class NikeShoes : IShoes {
    override fun show() {
        println("耐克鞋子")
    }
}

class NikeCloth : ICloth {
    override fun show() {
        println("耐克衣服")
    }
}

4.3 抽象工厂

interface Ifactory {
    fun makeCloth(): ICloth
    fun makeShoes(): IShoes
}

4.4 具体工厂(阿迪工厂、耐克工厂)

class AdidasFactory : Ifactory {
    override fun makeShoes(): IShoes = AdidasShoes()
    override fun makeCloth() = AdidasCloth()
}

class NikeFactory : Ifactory {
    override fun makeShoes(): IShoes = NikeShoes()
    override fun makeCloth() = NikeCloth()
}

4.5 使用

val adidasFactory = AdidasFactory()
val adidasCloth = adidasFactory.makeCloth()

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

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

相关文章

Python进阶知识(2)—— 什么是GUI编程?一起来学习用Python,Tkinter“做画”吧

文章目录 01 | 📕 什么是 G U I ? \color{red}{什么是GUI?} 什么是GUI?📕02 | 📙 什么是 T k i n t e r ?为什么是 T k i n t e r ? \color{orange}{什么是Tkinter?为什么…

ESP32在linux下烧录,提示权限有问题,解决方法

执行idf.py -p /dev/ttyACM0 flash下载时,提示这个错误 serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: /dev/ttyACM0 解决方法: 1检查串行端口 /dev/ttyUSB0 是否已被其他程序占用…

神经网络的梯度检查

当编写完一个深层的网络时,可能求导方式过于复杂稍微不小心就会出错,在开始训练使用这个网络模型之前我们可以先进行梯度检查。 梯度检查的步骤如下: 然后反向传播计算loss的导数grad,用以下公式计算误差: 通常来说&…

超星学习通小助手多线程工具Python

话不多说,直接开始,不会安转的直接使用后面两款,下载直接打开exe运行 第一款:网课小助手python,需要自行安装Python环境(支持Windows、Mac、Linux各种环境) https://wwiv.lanzoul.com/ifVrC0vk…

【K8s】控制器

文章目录 一、认识Pod控制器1、控制器介绍2、控制器种类 二、ReplicaSet(RS)1、RS的作用与资源清单2、创建RS3、pod扩缩容4、镜像升级5、删除RS 三、Deployment(Deploy)1、作用与资源清单2、创建deploy3、扩缩容4、镜像更新5、版本…

Vite 是如何站在巨人的肩膀上实现的

所谓的巨人,指的就是 Vite 底层所深度使用的两个构建引擎——Esbuild和Rollup。这两个构建引擎对于 Vite 来说究竟有多重要呢?在 Vite 的架构中,这两者各自扮演了什么样的角色?接下来,我们一起拆解 Vite 的双引擎架构&…

瑞吉外卖项目笔记02——员工管理、设置公共字段自动填充

三、员工信息管理 3.1 添加员工 注意:在设计数据库表字段时,给userName添加了唯一索引(所以员工用户名是无法重复的) 流程: 前端页面发送POST请求,后端接收到请求和数据,将用户数据添加到数…

PyQt5桌面应用开发(14):数据库+ModelView+QCharts

本文目录 PyQt5桌面应用系列下一个玩具报表一:Markdown文档的列表显示Widget的树、表、列报表Qt中的MVC框架模型视图代理 报表二:Markdown文档的长度图形数据:Markdown文档和Sqlite数据库代码总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#…

FE_Vue学习笔记 框架的执行流程详解

1 分析脚手架结构 (1)CLI就是 command line interface 的缩写。Vue CLI官网:Vue CLI (2)安装过程: (PS: 提前安装过node.js了,没有安装的可以打开这个:Downl…

Flutter - 搭建引擎调试环境(iOS)

文章目录 前言开发环境安装依赖环境1. python32. depot_tools 获取引擎项目1. 创建engine空目录2. 创建.gclient文件并配置3. 指定引擎版本4. 同步引擎源码 搭建调试环境1. 构建编译1.1 生成构建所需文件1.1.1 主机端1.1.2 iOS端 1.2 完成构建编译 2. Xcode调试2.1 设置本地引擎…

Qt扫盲-QAreaSeries理论总结

QAreaSeries理论总结 一、概述二、使用1. 创建QAreaSeries 对象2. 填充数据3. 设置区域4. 将面积图 与绘图设备关联5. 将绘图设备与 GUI窗口关联 一、概述 QAreaSeries类以面积图的形式显示数据。QAreaSeries用于显示定量数据。它基于QLineSeries 类,边界线条之间的…

二、Docker在Linux下的安装

文章目录 Docker在Linux下的安装Docker安装的前提环境安装1. 卸载旧的版本2. 安装yum-utils包3. 设置镜像的仓库4. 安装Docker相关的内容 启动Docker运行hello-world查看下载的hello-world镜像 了解卸载Docker Docker在Linux下的安装 Docker安装的前提环境 CentOS Docker 安装…

【LLM系列之PaLM】PaLM: Scaling Language Modeling with Pathways

论文题目:《Scaling Instruction-Finetuned Language Models》 论文链接:https://arxiv.org/abs/2204.02311 github链接1:https://github.com/lucidrains/PaLM-pytorch/tree/main; github链接2:https://github.com/conceptofmind/PaLM huggin…

每天一个提高效率的Matlab编程小技巧(1)-dbstop if error

相信在matlab调试程序的时候都遇到过这种情况:运行程序时命令行报错,而且出错的位置在我们自己定义的函数里,比如下面这个例子: 主函数main.m: a[1 2 3]; b[4 5]; csum_squares(a,b); 子函数sum_squares.m function csum_squa…

AI孙燕姿 ?AI东雪莲 !—— 本地部署DDSP-SVC一键包,智能音频切片,本地训练,模型推理,为你喜欢的角色训练AI语音模型小教程

目录 感谢B站UP羽毛布团 演示视频 稻香——东雪莲 虚拟——东雪莲 反方向的钟——东雪莲 晴天龙卷风——东雪莲 DDSP-SVC 3.0 (D3SP) 是什么? 下载资源: 解压整合包 准备数据集 智能音频切片 数据集准备 填写训练设置和超参数 开始训练 推…

这个抓包工具太强了,科来网络分析系统强烈推荐

一直以来抓包工具,都推荐和使用wireshark,简单好用。最近发现一款更强大好用的网络分析工具,科来网络分析系统。且技术交流版是完全免费的,无需注册激活。这里强烈推荐和分享给大家。这可是个网络报文分析和监控神器。有多强大&am…

【CSS系列】第七章 · CSS盒子模型,看这一篇就够了

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Protobuf-net3.2.8中的protogen.exe之使用

目录 protobuf是个好东西 遇到问题 顺便研究一下命令行程序如何调试 protobuf是个好东西 protobuf是一个轻量级的数据格式,相比json,它的数据量为json的1/3,且存储方式为2进制,并进行了压缩,序列化和反序列化更快&…

效率与性能并存——离不开 Visual Studio Code 的前端开发与我

文章目录 📋前言🎯题外话:我与 VSCode 的那些事🎯VSCode 的强大之处🧩VSCode 的诞生🧩VSCode 的一些功能 🎯优与劣(简单小结)📝最后 📋前言 许久…

JVM 原理简介

JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是:一次编…