建立型:四. 工廠方法模式
阿新 • • 發佈:2022-04-04
工廠方法模式是什麼
工廠方法模式是一種建立型設計模式, 其在父類中提供一個建立物件的方法, 允許子類決定例項化物件的型別。
為什麼用工廠方法模式
在新增一個產品時,不用去修改已有的程式碼。工廠方法將建立產品的程式碼與實際使用產品的程式碼分離,從而能在不影響其他程式碼的情況下擴充套件產品建立部分程式碼。例如,如果需要嚮應用中新增一種新產品,你只需要開發新的建立者子類,然後重寫其工廠方法即可。
工廠方法模式怎麼實現
factorymethod.go
package factorymethod //Operator 是被封裝的實際類介面 type Operator interface { SetA(int) SetB(int) Result() int } //OperatorFactory 是工廠介面 type OperatorFactory interface { Create() Operator } //OperatorBase 是Operator 介面實現的基類,封裝公用方法 type OperatorBase struct { a, b int } //SetA 設定 A func (o *OperatorBase) SetA(a int) { o.a = a } //SetB 設定 B func (o *OperatorBase) SetB(b int) { o.b = b }
minus_operator.go
package factorymethod //MinusOperator Operator 的實際減法實現 type MinusOperator struct { *OperatorBase } //MinusOperatorFactory 是 MinusOperator 的工廠類 type MinusOperatorFactory struct{} func (MinusOperatorFactory) Create() Operator { return &MinusOperator{ OperatorBase: &OperatorBase{}, } } //Result 獲取結果 func (o MinusOperator) Result() int { return o.a - o.b }
plus_operator.go
package factorymethod //PlusOperator Operator 的實際加法實現 type PlusOperator struct { *OperatorBase } //PlusOperatorFactory 是 PlusOperator 的工廠類 type PlusOperatorFactory struct{} func (PlusOperatorFactory) Create() Operator { return &PlusOperator{ OperatorBase: &OperatorBase{}, } } //Result 獲取結果 func (o PlusOperator) Result() int { return o.a + o.b }
example.go
package factorymethod
import "fmt"
func Example() {
minus := new(MinusOperatorFactory).Create()
minus.SetB(1)
fmt.Println(minus.Result())
}
優點
- 你可以避免建立者和具體產品之間的緊密耦合。
- 單一職責原則。 你可以將產品建立程式碼放在程式的單一位置, 從而使得程式碼更容易維護。
- 開閉原則。 無需更改現有客戶端程式碼, 你就可以在程式中引入新的產品型別。
缺點
- 在新增新的產品的時候,會導致系統類的增加,從而增加了系統的複雜性和理解難度。
- 為了系統的可擴充套件型,引入了抽象層,增加了系統的抽象性,和理解難度。