设计模式 - 工厂 Factory Method Pattern

news2025/1/15 7:04:24

文章参考来源

一、概念

创建简单的对象直接 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/524675.html

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

相关文章

【人工智能】— 贝叶斯网络

【人工智能】— 贝叶斯网络 频率学派 vs. 贝叶斯学派贝叶斯学派Probability(概率):独立性/条件独立性:Probability Theory(概率论):Graphical models (概率图模型)什么是图模型(Grap…

【每日一题/哈希表运用题】1054. 距离相等的条形码

⭐️前面的话⭐️ 本篇文章介绍【距离相等的条形码】题解,题目标签【哈希表】, 【贪心】,【优先级队列】,展示语言c/java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞&#…

【计算机网络复习】第四章 网络层 2

源主机网络层的主要工作 路由器网络层的主要工作 目的主机网络层的主要工作 网络层提供的服务 o 屏蔽底层网络的差异,向传输层提供一致的服务 虚电路网络 o 虚电路网络提供面向连接的服务 n 借鉴了电路交换的优点 n 发送数据之前,源主机和目的主机…

MTK耳机识别

MTK耳机检测分为Eint only和EintAccdet 其中主流的是Eint Accdet(multi-key)。 图为MTK 耳机相关电路图的主要部分。 其中,左右声道的33pF主要滤除TDD干扰。串的10R100nf下地电容为低通滤波器。磁珠主要影响的是Fm以及音频THD性能。 Eint:检测耳机是否…

网络基础知识(3)——初识TCP/IP

首先给大家说明的是,TCP/IP 协议它其实是一个协议族,包含了众多的协议,譬如应用层协议 HTTP、 FTP、MQTT…以及传输层协议 TCP、UDP 等这些都属于 TCP/IP 协议。 所以,我们一般说 TCP/IP 协议,它不是指某一个具体的网络…

Casdoor 开始

Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录、注册等与用户鉴权相关的一系列功能,只需几个步骤进行…

C++多线程中共享变量同步问题

目录 1、互斥量 (1)std::mutex (2)std::recursive_mutex (3)std::timed_mutex 2、锁管理器 (1)std::lock_guardlk (2)std::unique_locklk &#xff0…

掌控MySQL并发:深度解析锁机制与并发控制

前一篇MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC 讲了事务在并发执行时可能引发的一致性问题的各种现象。一般分为下面3种情况: 读 - 读情况:并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响,不会引起什么问题&…

【C++】C++中的多态

目录 一.多态的概念二.多态的定义及实现2.1虚函数2.2虚函数的重写虚函数重写的两个例外 2.3多态的构成条件2.4C11 override 和final2.5重载、重写、隐藏的对比 三.抽象类3.1概念3.2接口继承和实现继承 四.多态的原理4.1虚函数表4.2多态的原理(1)代码分析(2)清理解决方案 4.3动态…

MySQL高阶语句与连接

目录 高级查询selectDISTINCTWHEREAND ORINBETWEEN通配符与likeORDER BY数学函数聚合函数字符串函数mysql进阶查询GROUP BYHAVING别名子查询EXISTS连接查询inner join(内连接)left join(左连接)right join(右连接)自我连接 高级查询 实验准备: 第一张表&#xff1a…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

call to non-‘constexpr‘ function

文章目录 call to non-constexpr function概述备注END call to non-‘constexpr’ function 概述 在尝试迁移 openpnp - Smoothieware project 从gcc命令行 MRI调试方式 到NXP MCUXpresso工程. 在加了头文件路径后, 还有一些语法错误. 这和编译器语法有关系. 在运行BuildShe…

阿里云服务器部署flask项目「gunicorn + nginx + 支持https」

最近做了一个微信小程序,使用 flask 实现了对应的后台,上线需要部署到服务器上,之前只是了解并没有全链路试过,靠着网上的资料最终完成部署上线,但中间遇到了较多的一些问题,网上的资料也比较零碎&#xff…

WPF MaterialDesign 初学项目实战(2)首页导航栏样式

其他内容 WPF MaterialDesign 初学项目实战(0):github 项目Demo运行 WPF MaterialDesign 初学项目实战(1)首页搭建 MaterialDesign 确保运行了初学项目实战(0) MaterialDesign给我们提供了很多的样式库&…

微服务框架【笔记-Nacos环境隔离】

Nacos注册中心 环境隔离 - namespace Nacos 中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离 Nacos默认的命名空间: 创建命名空间复制命名空间ID启动Orderservice服务,在nacos服务列表可以看到环境隔离之后的服…

vue实现电梯锚点导航

1、目标效果 最近喝了不少的咖啡、奶茶,有一个效果我倒是挺好奇怎么实现的: (1)点击左侧分类菜单,右侧滚动到该分类区域 (2)右侧滑动屏幕,左侧显示当前所处的分类区域 这种功能会出现…

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时,除了最简单的直接对接口发起请求,很多时候需要对接口进行一些前置操作:比如提前生成测试数据,以及一些后置操作:比如提取接口响应内容中的某个字段的值。举个最常用…

XDC约束技巧 之 I/O篇 (上)

《XDC约束技巧之时钟篇》中曾对I/O约束做过简要概括,相比较而言,XDC中的I/O约束虽然形式简单,但整体思路和约束方法却与UCF大相径庭。加之FPGA的应用特性决定了其在接口上有多种构建和实现方式,所以从UCF到XDC的转换过程中&#x…

都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平

一、博弈Ai:GPT3.5版 演示:https://chat.bo-e.com/ 1、充当英语发言助手 评分:10分 总结:完整满足了指令需求 2、充当英汉互译器 评分:8分 总结:基本满足了我的指令需求。但是有点啰嗦,扣…

MySQL---视图(定义、修改、更新、重命名、删除)

1. 定义视图 视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命 名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。 数据库中只存放了…