設(shè)計(jì)模式代表了最佳的實(shí)踐
引言
- 創(chuàng)建型模式。
- 主要解決:不同條件下逊谋,創(chuàng)建不同實(shí)例擂达。
- 關(guān)鍵代碼:接口制定規(guī)范。
- 用戶只想考慮頂層需求胶滋,給我想要的板鬓! 怎么辦呢? 外包(工廠)究恤!
場(chǎng)景
- 通過 new 就能創(chuàng)建的對(duì)象穗熬,無需使用工廠模式。
- 用戶不關(guān)心實(shí)例的創(chuàng)建丁溅、組合和表達(dá)的細(xì)節(jié)。
- 生成復(fù)雜對(duì)象的地方探遵,都可以使用工廠方法模式窟赏。
1. 簡(jiǎn)單工廠模式
1.1 圖示
簡(jiǎn)單工廠模式
1.2 代碼示例
interface Color {
fun paint()
}
class Red : Color {
override fun paint() {
println("Color Red::paint() method")
}
}
class Green : Color {
override fun paint() {
println("Color Green::paint() method")
}
}
class ColorFactory {
fun getColor(colorType: String): Color? {
return when (colorType) {
"RED" -> {
Red()
}
"GREEN" -> {
Green()
}
else -> null
}
}
}
class FactoryColorDemo {
companion object {
@JvmStatic
fun main(args: Array<String>) {
val colorFactory = ColorFactory()
//獲取 Red 的對(duì)象,并調(diào)用它的 paint 方法
val red = colorFactory.getColor("RED")
red?.paint()
//獲取 Green 的對(duì)象箱季,并調(diào)用它的 paint 方法
val green = colorFactory.getColor("GREEN")
green?.paint()
}
}
}
1.3 圖示(簡(jiǎn)單工廠模式 增加產(chǎn)品)
簡(jiǎn)單工廠模式 增加產(chǎn)品
1.4 優(yōu)缺點(diǎn)
- 增加新的產(chǎn)品子類涯穷,需要在工廠中增加新的if-else。
- 擴(kuò)展性差藏雏,違背了開閉原則拷况,也影響了可讀性。
- 適合使用在業(yè)務(wù)較簡(jiǎn)單掘殴,工廠類不會(huì)經(jīng)常更改的情況赚瘦。
2. 工廠模式
2.1 圖示
工廠模式
2.2 代碼示例
interface Color {
fun paint()
}
class Red : Color {
override fun paint() {
println("Color Red::paint() method")
}
}
class Green : Color {
override fun paint() {
println("Color Green::paint() method")
}
}
interface ColorFactory {
fun createColor(): Color
}
class RedColorFactory : ColorFactory {
override fun createColor(): Color {
return Red()
}
}
class GreenColorFactory : ColorFactory {
override fun createColor(): Color {
return Green()
}
}
class FactoryColorDemo {
companion object {
@JvmStatic
fun main(args: Array<String>) {
//獲取 Red 的對(duì)象,并調(diào)用它的 paint 方法
val redColorFactory = RedColorFactory()
val red = redColorFactory.createColor()
red.paint()
//獲取 Green 的對(duì)象奏寨,并調(diào)用它的 paint 方法
val greenColorFactory = GreenColorFactory()
val green = greenColorFactory.createColor()
green.paint()
}
}
}
2.3 圖示(工廠模式 增加產(chǎn)品)
工廠模式 增加產(chǎn)品
2.4 優(yōu)缺點(diǎn)
- 一個(gè)子類對(duì)應(yīng)一個(gè)工廠類起意,類膨脹。
- 類數(shù)量多病瞳,代碼復(fù)雜度高揽咕。
3. 抽象工廠模式
3.1 圖示
抽象工廠模式
3.2 代碼示例
interface Color {
fun paint()
}
class Red : Color {
override fun paint() {
println("Color Red::paint() method")
}
}
class Green : Color {
override fun paint() {
println("Color Green::paint() method")
}
}
interface Shape {
fun draw()
}
class Rectangle : Shape {
override fun draw() {
println("Shape Rectangle::draw() method")
}
}
class Circle : Shape {
override fun draw() {
println("Shape Circle::draw() method")
}
}
interface LogoFactory {
fun createColor(): Color
fun createShape(): Shape
}
class HappyLogoFactory : LogoFactory {
override fun createColor(): Color {
return Red()
}
override fun createShape(): Shape {
return Circle()
}
}
class AngryLogoFactory : LogoFactory {
override fun createColor(): Color {
return Green()
}
override fun createShape(): Shape {
return Rectangle()
}
}
class FactoryColorDemo {
companion object {
@JvmStatic
fun main(args: Array<String>) {
//獲取 喜慶Logo(燈籠紅) 的對(duì)象
val happyLogoFactory = HappyLogoFactory()
val happyColor = happyLogoFactory.createColor()
val happyShape = happyLogoFactory.createShape()
happyColor.paint()
happyShape.draw()
//獲取 憤怒Logo(彈幕綠) 的對(duì)象
val angryLogoFactory = AngryLogoFactory()
val angryColor = angryLogoFactory.createColor()
val angryShape = angryLogoFactory.createShape()
angryColor.paint()
angryShape.draw()
}
}
}
3.3 圖示(抽象工廠模式 增加產(chǎn)品)
抽象工廠模式 增加產(chǎn)品
3.4 圖示(抽象工廠模式 增加工廠)
抽象工廠模式 增加工廠
3.5 圖示(抽象工廠模式 概括總結(jié))
抽象工廠模式 概括總結(jié)
3.6 優(yōu)缺點(diǎn)
- 產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象套菜。
- 產(chǎn)品族難擴(kuò)展亲善,產(chǎn)品等級(jí)易擴(kuò)展。
4. 小結(jié)
- 簡(jiǎn)單工廠:唯一工廠類逗柴,工廠類依據(jù)入?yún)?chuàng)建產(chǎn)品對(duì)象蛹头。
- 工廠方法:多個(gè)工廠類,擴(kuò)展產(chǎn)品子類,增加對(duì)應(yīng)工廠即可掘而。
- 抽象工廠:多個(gè)工廠類挟冠,產(chǎn)品子類分組,工廠組合為產(chǎn)品族袍睡。
?