1. 程式人生 > 其它 >建立型:四. 工廠方法模式

建立型:四. 工廠方法模式

工廠方法模式是什麼

工廠方法模式是一種建立型設計模式, 其在父類中提供一個建立物件的方法, 允許子類決定例項化物件的型別。

為什麼用工廠方法模式

在新增一個產品時,不用去修改已有的程式碼。工廠方法將建立產品的程式碼與實際使用產品的程式碼分離,從而能在不影響其他程式碼的情況下擴充套件產品建立部分程式碼。例如,如果需要嚮應用中新增一種新產品,你只需要開發新的建立者子類,然後重寫其工廠方法即可。

工廠方法模式怎麼實現

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())
}

優點

  1. 你可以避免建立者和具體產品之間的緊密耦合。
  2. 單一職責原則。 你可以將產品建立程式碼放在程式的單一位置, 從而使得程式碼更容易維護。
  3. 開閉原則。 無需更改現有客戶端程式碼, 你就可以在程式中引入新的產品型別。

缺點

  1. 在新增新的產品的時候,會導致系統類的增加,從而增加了系統的複雜性和理解難度。
  2. 為了系統的可擴充套件型,引入了抽象層,增加了系統的抽象性,和理解難度。