创建型模式 - 工厂
Kotlin里面几种主流创建型设计模式:工厂方法模式,抽象工厂模式,构建者模式
8.1 伴生对象增强工厂模式
通过一个工厂类,隐藏对象。典型场景就是拥有一个父类和多个子类,通过这种模式创建子类对象。
公共模型例子
interface Computer{
val cpu:String
}
class PC(override val cpu:String="Core"):Computer
class Server(override val cpu:String="Xeon"):Computer
enum class ComputerType{
PC,Server
}
1 用kotlin 模仿Java 创建工厂
class ComputerFactory{
fun produce(type:ComputerType):Computer{
return when(type){
ComputerType.PC -> PC()
ComputerType.Server -> Server()
}
}
}
fun main() {
val computer = ComputerFactory().produce(ComputerType.PC)
println(computer.cpu)
}
2 用object天然单利简化---替代工厂类
/**
* 利用object单利替换工厂类,并且利用操作符重载invoke方法替代produce
*/
object ComputerFactory {
operator fun invoke(type: ComputerType): Computer {
return when (type) {
ComputerType.PC -> PC()
ComputerType.Server -> Server()
}
}
}
fun main() {
ComputerFactory(ComputerType.PC)
}
3 伴生对象创建静态工厂≈
---> 静态工厂替换构造器(Effective Java中的指导原则)
interface Computer{
val cpu:String
companion object Factory{
operator fun invoke(type:ComputerType):Computer{
return when(type){
ComputerType.PC->PC()
ComputerType.Server->Server()
}
}
}
}
fun main() {
println(Computer.Factory(ComputerType.Server).cpu)
}
Factory 比较习惯这个名字,其实可以省略,直接调用Computer(ComputerType.PC)
4 扩展伴生对象方法
对于经典工厂模式,实际业务中,我们针对是Computer接口的使用,所有的实现细节都做了很好的隐藏。如果我们是第三方类库的方式使用,想进一步改造他的逻辑,Kotlin中的伴生对象同样可以靠他的扩展函数特性,实现这个需求
省略Factory ,新需求,根据cpu类型,判断电脑的类型
/**
* 模拟第三方库扩展,根据cpu型号判断电脑的类型
*/
fun Computer.Companion.fromCPU(cpu: String): ComputerType? = when (cpu) {
"Core" -> ComputerType.PC
"Xeon" -> ComputerType.Server
else -> null
}