当前位置: 首页 > news >正文

Kotlin~工厂方法、抽象工厂模式

简单工厂模式

简单工厂模式并不属于设计模式的一种,反而更像是一种编程习惯。

简单工厂模式包含如下角色

  • 抽象产品:定义了产品的规范,描述了产品的主要特征和性能
  • 具体产品:实现或继承了抽象产品的子类
  • 具体工厂:提供了创建产品的方法,调用中通过调用该方法来获取产品
abstract class Car(){
    abstract fun build()
}

class ChangCheng(): Car(){
    override fun build() {
        println("build changcheng")
    }
}

class ChangAn(): Car(){
    override fun build() {
        println("build changan")
    }
}

class CarFactory{
    fun create(type: String): Car{
        return when(type){
            "changcheng" -> ChangCheng()
            else -> ChangAn()
        }
    }
}

优缺点

  • 优点:把对象的创建和使用封开,更加容易拓展。

  • 缺点新增产品时需要修改工厂类,违背了开闭原则。

工厂方法模式

如果在需要创建对象的时候直接新建一个对象,就会对该对象耦合严重,如果我们需要更换对象时,就需要对所有新建对象的地方都修改一边,这就违背了开闭原则。因此会使用工厂模式来创建对象,我们可以直接在工厂中创建对象,因此更换对象也可以直接在工厂中进行,这样就达到了与对象解耦的目的,因此,工厂模式最大的优点就是与对象解耦。

工厂方法模式完美的解决了上述缺点,遵循开闭原则

工厂方法uml
工厂方法模式包含如下角色:

  • 抽象工厂:提供创建产品的接口,

  • 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建

  • 抽象产品:定义了产品的规范,描述了产品的主要特征和性能

  • 具体产品:实现或继承了抽象产品的子类

abstract class Car(){
    abstract fun build()
}

interface CarFactory {
    fun createCar(): Car
}

class ChangChengFactory : CarFactory {
    override fun createCar(): Car {
        return ChangCheng()
    }
}

class ChangAnFactory : CarFactory {
    override fun createCar(): Car {
        return ChangAn()
    }
}

class Store(val factory: CarFactory) {
    fun create(): Car {
        return factory.createCar()
    }
}

fun main() {
    // 长安工厂生产汽车
    val store = Store(ChangAnFactory())
    store.create().build()

    // 长城工厂生产汽车
    val store1 = Store(ChangChengFactory())
    store1.create().build()
}

优点
完美的遵循了开闭原则。
缺点
新增一个产品需要增加几个类,增加了代码的复杂性。

抽象工厂模式

主要功能:提供统一的接口创建一系列相关的产品

提供创建一系列相关或相互依赖对象的接口。

  • 提供创建一系列相关或相互依赖对象的接口,而不指定它们具体的类

  • 将一组对象实现细节与它们的一般使用分离出来。
    抽象工厂uml

abstract class SuvCar(){
    abstract fun build()
}

interface CarFactory1 {
    fun createCar(): Car
    fun createSuvCar():SuvCar
}


class SmartFactory : CarFactory1 {
    override fun createCar(): Car {
        return ChangCheng()
    }

    override fun createSuvCar(): SuvCar {
        return SuvCar1()
    }
}

class Store1(val factory: CarFactory1) {
}

fun main() {

    val store = Store1(SmartFactory())
    store.factory.createCar().build()
    store.factory.createSuvCar().build()
}

适用场景:

  • 游戏服装套装,通常一整套一起换。
  • 操作系统的组件模块,同一组模块需要对应相同的系统

优点

  • 规范创建相同系列产品的方式
  • 只需要暴露创建接口,可以隐藏实现细节
  • 容易改变产品系列

缺点

  • 扩展产品库需要额外工作:出了产品代码外,还需要改动Factory

总结

工厂方法对比简单工厂,增加了一层工厂抽象,实现专门的工厂生产专门的汽车;抽象工厂相比工厂方法,一个工厂可以生产不同类型的产品。简单工厂模式和工厂方法模式都是创建一类产品的模式,而抽象工厂模式是创建多个产品的模式,但是模式和工厂方法模式相同,只不过抽象工厂需要去写多个产品方法。

参考:

  • 设计模式-创建型-抽象工厂(改进)

  • 给人看的Kotlin设计模式——工厂方法 - 简书

  • 给人看的Kotlin设计模式——抽象工厂 - 简书

相关文章:

  • C++继承(下)
  • PKI证书签发系统(2.0web版)
  • Ubuntu20.4下安装TensorFlow2.x
  • 【项目部署】Python Django部署到阿里云
  • MySQL数据库索引并没有你想的那么难之第一节
  • 数据结构与算法-单链表
  • 记一次git误操作, 合并冲突别人新增文件显示成“自己新增“绿色文件
  • Dubbo----------------------------配置信息整合SpringBoot的三种方式
  • 基于视觉的车道线识别技术在智能车导航中的应用研究
  • bleu-mp 多进程bleu评估工具
  • webpack多进程打包
  • 索尼IMX316 标定_ToF模块相机校准
  • 【Proteus仿真】【51单片机】智能鱼缸系统设计
  • 瑞吉外卖2.0 Redis 项目优化 Spring Cache MySQL主从复制 sharding-JDBC Nginx
  • 2023-02-04 Elasticsearch 倒排索引的理解 Trie前缀树原理
  • 【DIY小记】VMWare设置主机连接到的Ubuntu虚拟机的网络端口
  • Spring Boot 集成Quartz
  • 【Java学习】JUC并发编程
  • 【入门AUTOSAR网络管理测试】CANoe测试T_STARTx_AppFrame时间
  • Apache Shiro身份验证绕过(CVE-2023-22602)
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉