創(chuàng)建型模式 - 工廠
Kotlin里面幾種主流創(chuàng)建型設(shè)計(jì)模式:工廠方法模式,抽象工廠模式漆撞,構(gòu)建者模式
8.1 伴生對(duì)象增強(qiáng)工廠模式
通過一個(gè)工廠類,隱藏對(duì)象。典型場(chǎng)景就是擁有一個(gè)父類和多個(gè)子類映挂,通過這種模式創(chuàng)建子類對(duì)象。
公共模型例子
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 創(chuàng)建工廠
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天然單利簡(jiǎn)化---替代工廠類
/**
* 利用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 伴生對(duì)象創(chuàng)建靜態(tài)工廠≈
---> 靜態(tài)工廠替換構(gòu)造器(Effective Java中的指導(dǎo)原則)
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 比較習(xí)慣這個(gè)名字柑船,其實(shí)可以省略,直接調(diào)用Computer(ComputerType.PC)
4 擴(kuò)展伴生對(duì)象方法
對(duì)于經(jīng)典工廠模式泼各,實(shí)際業(yè)務(wù)中鞍时,我們針對(duì)是Computer接口的使用,所有的實(shí)現(xiàn)細(xì)節(jié)都做了很好的隱藏扣蜻。如果我們是第三方類庫(kù)的方式使用逆巍,想進(jìn)一步改造他的邏輯,Kotlin中的伴生對(duì)象同樣可以靠他的擴(kuò)展函數(shù)特性莽使,實(shí)現(xiàn)這個(gè)需求
省略Factory 锐极,新需求,根據(jù)cpu類型芳肌,判斷電腦的類型
/**
* 模擬第三方庫(kù)擴(kuò)展灵再,根據(jù)cpu型號(hào)判斷電腦的類型
*/
fun Computer.Companion.fromCPU(cpu: String): ComputerType? = when (cpu) {
"Core" -> ComputerType.PC
"Xeon" -> ComputerType.Server
else -> null
}