专业编程基础技术教程

网站首页 > 基础教程 正文

使用Kotlin实现简单工厂模式和类型安全的简单工厂

ccvgpt 2024-11-19 02:13:49 基础教程 7 ℃

一、内容概述

简单工厂是一种创建型模式,其别名叫静态工厂模式。其存在的目的是用来创建其他类的实例的,即利用面向对象思想的继承、多态、封装来实现,而别创建的对象实例通常都有一个公共的父类或者公共的接口。而公共部分通常都有统一的抽象行为。

例如:如下要展示的例子是,创建一个计算器使这个计算机能够拥有加减乘除四个运算法则。

使用Kotlin实现简单工厂模式和类型安全的简单工厂

1.operation 抽象类,定义公共的行为以及属性

2.ExceptOperation、MinusOperation、PlusOperation、RideOperation加减乘除四个类,继承自Operation

3.OperationFactory.kt、简单工厂

4.OperationFactory2.kt、类型安全的简单工厂



二、代码实战部分

/**
 * 创建一个操作符基类,用来抽象具体的操作符
 * Created by yangwei on 2020/7/29.
 */
abstract class Operation {
    var numberOne: Double = 0.0
    var numberTwo: Double = 0.0
    abstract fun getResult(): Double
}

/**
 * 除法操作符
 * Created by yangwei on 2020/7/29.
 */
class ExceptOperation : Operation() {
    override fun getResult(): Double {
        if (numberTwo == 0.0) {
            throw Exception("除数不能为0")
        }
        return numberOne / numberTwo
    }
}
/**
 * 定义减法操作符
 * Created by yangwei on 2020/7/29.
 */
class MinusOperation : Operation() {
    /**
     * 获取相减后的结果
     */
    override fun getResult(): Double {
        return numberOne - numberTwo
    }
}
/**
 * 加法操作符
 * Created by yangwei on 2020/7/29.
 */
class PlusOperation : Operation() {
    /**
     * 获取加法操作符的结果
     */
    override fun getResult(): Double {
        return numberOne + numberTwo

    }
}
/**
 * 乘法操作符
 * Created by yangwei on 2020/7/29.
 */
class RideOperation :Operation(){
    /**
     * 获取相乘后的结果
     */
    override fun getResult(): Double {
        return numberOne*numberTwo
    }
}
/**
 * 定义一个操作符工厂
 * 将其定义成单例形式
 * Created by yangwei on 2020/7/29.
 */
object OperationFactory {
    /**
     * 创建操作符
     */
    fun createOperation(operation: String): Operation {
        return when (operation) {
            "+" -> PlusOperation()
            "-" -> MinusOperation()
            "*" -> RideOperation()
            "/" -> ExceptOperation()
            else -> throw Exception("操作符不正确")
        }
    }

}

/**
 * 实现简单工厂模式
 */
fun main(args: Array<String>?) {
    var plus = OperationFactory.createOperation("+")
    plus.numberOne = 10.0
    plus.numberTwo = 20.0
    var result = plus.getResult()
    println(result)
}
/**
 * 利用枚举改进简单工厂,提供更安全的类型检查
 * Created by yangwei on 2020/7/29.
 */
object OperationFactory2 {
    enum class OperationName {
        PLUS, //加法
        MINUS, //减法
        RIDE, //乘法
        EXCEPT//除法
    }

    /**
     * 创建运算法则
     */
    fun createOperation(name: OperationName): Operation {
        return when (name) {
            OperationName.PLUS -> PlusOperation()
            OperationName.MINUS -> MinusOperation()
            OperationName.RIDE -> RideOperation()
            OperationName.EXCEPT -> ExceptOperation()
        }
    }
}

/**
 * 对简单工厂做测试
 */
fun main(args: Array<String>) {
    var operationPlus = OperationFactory2.createOperation(OperationFactory2.OperationName.PLUS)
    operationPlus.numberOne = 10.0
    operationPlus.numberTwo = 20.0
    var result = operationPlus.getResult()
    println(result)
}



三、总结

大家重点看下最后一个类OperationFactory2这个类,这个类利用了枚举提供了输入的类型安全,枚举只定义了加减乘除四个值,如果用户传入其他值则编译会报错,这就基本上在编码过程中完全限制了类型安全。




四、结束语

除了上述两种方式来优化简单工厂外,还可以利用Kotlin的反射来对OperationFactory进行优化,让其传入一个类名,通过反射来生成具体的实例。进一步改进代码的简洁性。

Tags:

最近发表
标签列表