网站首页 > 基础教程 正文
一、内容概述
简单工厂是一种创建型模式,其别名叫静态工厂模式。其存在的目的是用来创建其他类的实例的,即利用面向对象思想的继承、多态、封装来实现,而别创建的对象实例通常都有一个公共的父类或者公共的接口。而公共部分通常都有统一的抽象行为。
例如:如下要展示的例子是,创建一个计算器使这个计算机能够拥有加减乘除四个运算法则。
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进行优化,让其传入一个类名,通过反射来生成具体的实例。进一步改进代码的简洁性。
- 上一篇: Kotlin 07. When 表达式示例
- 下一篇: 【进阶玩法】策略+责任链+组合实现合同签章
猜你喜欢
- 2024-11-19 1-0 Protobuf通信协议.proto文件编写
- 2024-11-19 阿里P8资深架构师耗时一年整理19年Java工程师成神之路
- 2024-11-19 Java修炼终极指南:83. 声明一个Java记录
- 2024-11-19 Effective Java 3rd(Java高效编程)技术要点
- 2024-11-19 Spring源码系列(二)
- 2024-11-19 Java 14 发布了,快来了解下吧
- 2024-11-19 Spring技巧:深入研究Java 14和SpringBoot
- 2024-11-19 IntelliJ IDEA 2023.2 最新变化
- 2024-11-19 数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟
- 2024-11-19 Spring Bean生命周期你除了会背八股文面试,真的会用了吗?
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)