【Kotlin设计模式】Kotlin实现工厂模式

前言


工厂模式(Factory Pattern)是一种创建型设计模式,提供一个创建对象的接口,不暴露对象的创建过程。它将实例化对象的任务交给子类或具体实现,从而使得客户端代码与具体类解耦。

工厂模式主要分为以下三类:

1、简单工厂模式(Simple Factory
2、工厂方法模式(Factory Method
3、抽象工厂模式(Abstract Factory


实现

1、简单工厂模式

Kotlin中可以借助伴生对象companion object来实现工厂模式,客户端不需要知道具体产品类的类名,只需要创建将产品类型传给工厂即可,降低了客户端与具体产品类的耦合,适合产品类目较少且不变动的情况下。

当后续要不断增加产品类型,这种模式就不太适合了,新增产品需要修改工厂类,则会导致工厂类太过臃肿,不利于维护。

在这里插入图片描述

假设有个小产品生产工厂,生产不同类目的产品,新建产品接口、这个工厂只能生产的产品类目有篮球、牛奶、笔。


interface Product {fun doWhat()
}//踢足球
class FootBall : Product {override fun doWhat() {println("Football can be played")}
}//喝牛奶
class Milk : Product {override fun doWhat() {println("Milk can be drunk")}
}//写字
class Pen :Product{override fun doWhat() {println("Pen can be write")}
}

生产产品的过程如下,商务有牛奶的订单交由产线生产,客户端告诉产线生产牛奶即可。


class SimpleFactory {companion object {fun createProduct(type: String): Product {return when (type) {"FootBall" -> { FootBall() }"Milk" -> { Milk() }"Pen" -> { Pen() }else -> {throw IllegalArgumentException("unKnow product type")}}}}
}SimpleFactory.createProduct("Milk").doWhat()  //输出  Milk can be drunkSimpleFactory.createProduct("Cup").doWhat()   //输出  UnKnow product type

2、工厂方法模式

在更复杂的场景中,可以使用接口或抽象类来定义工厂方法,这样可以允许不同的工厂类创建不同类型的对象。

在这里插入图片描述


interface Factory{fun createProduct():Product
}/*** 球生成工厂*/
class BallFactory : Factory {override fun createProduct(): Product {return FootBall()}
}/*** 牛奶生产工厂*/
class MilkFactory : Factory {override fun createProduct(): Product {return Milk()}
}/*** 笔生产工厂*/
class PenFactory : Factory {override fun createProduct(): Product {return Pen()}
}

创建产品的过程不放到不同的工厂中,每个工厂只生成对应的产品即可,实例化过程放到对应的子类中进行,但是这样的坏处就是增加类的数目,增加了系统的复杂性。


3、抽象工厂模式


抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类,但是这样也会增加系统的复杂性和类的数量。

假设牛奶厂家做活动,买一箱牛奶送一辆豪车,蒙牛和保时捷联合、伊利和宾利合作,牛奶和车要在同一工厂生产,这种情况可以使用抽象工厂模式来实现。

在这里插入图片描述

抽象工厂模式的核心是抽象工厂接口和具体工厂类,通常包括:

1、抽象产品、接口(AbstractProduct


interface Milk {fun taste()
}interface Car {fun slogan()
}

2、具体产品(ConcreteProduct


class MengNiu : Milk {override fun taste() {println("【蒙牛】纯甑酸奶砀山黄桃燕麦味")}
}class YiLi : Milk {override fun taste() {println("【伊利】安慕希丹东草莓酸奶")}
}class Porsche : Car {override fun slogan() {println("only Porsche can beat Porsche")}
}class Bentley : Car {override fun slogan() {println("Bentley,Be Extraordinary")}
}

3、抽象工厂(AbstractFactory

/*** 抽象工厂类,定义生产牛奶和车接口*/
interface AbstractFactory {fun createMilk(): Milkfun createCar(): Car
}

4、具体工厂(ConcreteFactory


//MengNiu同步生产活动蒙牛牛奶和保时捷
class FactoryMengNiuUnion : AbstractFactory {override fun createMilk(): Milk {return MengNiu()}override fun createCar(): Car {return Porsche()}
}//YiLi同步生产活动伊利牛奶和宾利
class FactoryYiLiUnion: AbstractFactory {override fun createMilk(): Milk {return YiLi()}override fun createCar(): Car {return Bentley()}
}

5、客户端(Client

val factoryA:AbstractFactory = FactoryMengNiuUnion()val mengNiuMilk = factoryA.createMilk() mengNiuMilk.taste()	 				//【蒙牛】纯甑酸奶砀山黄桃燕麦味val porsche = factoryA.createCar() porsche.slogan()						// only Porsche can beat Porscheval factoryB:AbstractFactory = FactoryYiLiUnion()val yiLiMilk = factoryB.createMilk()yiLiMilk.taste()  				   //【伊利】安慕希丹东草莓酸奶val bentley = factoryB.createCar()bentley.slogan()     				   //Bentley,Be Extraordinary

总结

工厂模式在解耦对象创建和使用、提高系统扩展性和维护性方面具有明显优势,但在系统复杂性和管理难度上也存在一定的代价。选择是否使用工厂模式应基于系统需求的复杂程度和对象创建的复杂性。

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

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

相关文章

音乐剪辑软件哪个好用?免费音乐编辑软件大推荐

在音符跳跃的创意海洋里,每一段旋律都藏着一个故事等待被精心雕琢。 但何以让这份灵感自由翱翔,又无需负担昂贵的工具枷锁?哪款音乐剪辑软件免费版能够成为你音乐创作旅程中的最佳拍档? 在这五彩斑斓的数字音频世界中&#xff0…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用? 在 Vi 输入电压接近于零时,D1、D2 给三极管 T1、T2 提供偏置电压,使 T1、T2 维持导通,以消除交越失真。 陈氏解释 这道题参见:硬件面试经典 100 题(51~70 题…

Nginx 反向代理实现 Tomcat 高可用性负载均衡详解

Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务…

【OpenCV】 中使用 Lucas-Kanade 光流进行对象跟踪和路径映射

文章目录 一、说明二、什么是Lucas-Kanade 方法三、Lucas-Kanade 原理四、代码实现4.1 第 1 步:用户在第一帧绘制一个矩形4.2 第 2 步:从图像中提取关键点4.3 第 3 步:跟踪每一帧的关键点 一、说明 本文针对基于光流法的目标追踪进行叙述&am…

影响我国地理信息产业发展最大的阻碍是?

我国地理信息产业发展迅速,大家可以从业内协会领导或院士报告中了解相关数据,每年地理信息产业规模多少多少亿,增长多少多少百分比,在成绩喜人的同时,当然专家或院士从更高层面分析了当前地理信息产业所遇到的困难与阻…

如何使用ssm实现基于ssm的“游侠”旅游信息管理系统

TOC ssm190基于ssm的“游侠”旅游信息管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化&#x…

如何用Java SpringBoot和Vue搭建高效的OA办公管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

Leetcode 46.全排列

注意的点: 1、回溯本质就是搜索树的树枝,维护三个核心变量:path(需要恢复现场),visited(需要恢复现场),以及res 解法:回溯算法 class Solution:def permut…

linux死锁问题和cpu使用率过高问题排查

1、问题共同点 死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。 死锁问题需要我们找出哪两个线程出现了死锁情况。 cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。 2、命令排查 2.1、查看机器上的Java进程 jcmd或 jps2.2、查看对应Java进程的线程级别…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目,项目已经打好了jar包,现在我们发现jar包依赖的子包有问题,其中的一个mybatis xml文件查询数据不正确,我们需要替换项目&#xf…

Java语言程序设计基础篇_编程练习题*17.4 (将文本文件转換为UTF格式)

目录 题目:*17.4 (将文本文件转換为UTF格式) 习题思路 代码示例 输出结果 题目:*17.4 (将文本文件转換为UTF格式) 编写一个程序,每次从文本文件中读取多行字符,并将这些行字符以UTF-8字符串格式写入一个二进制文件中…

Jenkins 2.346.1完整搭建及项目部署安装

java version "1.8.0_202" 1.安装 官网下载war包直接启动,比较简单, linux命令 : wget https://mirrors.jenkins.io/war-stable/2.346.1/jenkins.war 2.启动命令 nohup java -jar jenkins.war --httpPort8777 --prefix/jenkin…

整套厨帽检测算法样本、模型、源码和厨帽算法识别应用方案介绍

厨帽检测算法的应用方案主要涉及技术选型、硬件配置、软件集成、部署与监控以及应对实际挑战等多个方面。以下是一个详细的应用方案概述: 一、技术选型 深度学习技术:厨帽检测算法主要基于深度学习技术,特别是卷积神经网络(CNN&…

“解锁进程间高效沟通,Linux IPC是你的关键钥匙!“#Linux系统编程之进程间通信【下】

"解锁进程间高效沟通,Linux IPC是你的关键钥匙!"#Linux系统编程之进程间通信【下】 前言预备知识一、 共享内存概述1.1 共享内存概述简图 二、 共享内存编程实战2.1 共享内存介绍2.1.1 共享内存的特点 2.2 共享内存几个重要API介绍2.2.1 shmge…

三品船舶PLM解决方案详情 三品PLM软件在船舶制造行业应用优势

自2024年起,船舶行业PLM(产品全生命周期管理)技术步入关键发展阶段。国产化工业软件领域积极倡导生态合作,推广统一技术底座下的合作开发模式,整合国内外成熟的工业软件技术与应用资源,旨在全面提升国内船舶…

webflux源码解析(3)-reactor netty

目录 1.连接的状态2.reactor netty中的连接状态3. webflux中的io处理4.总结 为什么webflux在io密集型的场景能有效的提升系统吞吐量呢? 是因为它使用的是响应式编程,使用的是NIO,但这里的响应式、nio到底是怎么样的呢?响应式编程上…

vue的for循环不建议用index作为key

我们页面总有一些相似的,我们想用循环渲染,根据对象数组结构进行渲染,这是不是很熟悉的场景。这时候我们需要有一个唯一的key绑定在循环渲染的元素上,一般情况下我们会用id,因为id是唯一的。然而有些页面要循环的数据&…

生鲜O2O系统app源码开发之功能解析:构建高效便捷的生鲜电商生态

随着互联网技术的飞速发展和消费者对于生活品质要求的日益提升,生鲜电商行业迎来了前所未有的发展机遇。生鲜O2O(Online to Offline)系统作为连接线上购物与线下服务的关键桥梁,其源码开发不仅关乎平台的稳定运行,更直…

【XML详解】

XML基本概念 XML(全称EXtensible Markup Language,可扩展标记语言):是一种用于存储和传输数据的标记语言,通过标签(tags)来定义数据的结构和含义。数据格式:XML本质上是一种数据的格…

盘点15款主流客户管理系统,助力企业选型!

本文将盘点15款主流客户管理系统: 简道云、纷享销客、销售易、HubSpot、Zoho CRM、SAP CRM、Oracle CRM、金蝶云星空 CRM、用友 CRM、悟空 CRM、Salesforce、Microsoft Dynamics 365、亿客 CRM、八百客 CRM、CloudCC CRM。 在当今的商业环境中,客户管理系…