設計模式 in Go:Factory

建造模式,處理與創建對象及對象實例化過程相關的問題,通常尋求以分離業務代碼和對象創建邏輯,或將複雜的構造邏輯封裝在可重用組件中的方式。

現在讓我們逐步瞭解第一種建造模式——工廠模式。

問題背景:
設想這樣一種場景,當您想要生產一些產品(產品可以是任何對象),同時不希望將產品綁定到特定的類。我們可以使用工廠來作爲生產者。具體地說,我們不希望顯示寫太多這樣的代碼:

var a IProductA
var b IProductB
...
a = new(IProductA) // 不希望這裏的代碼與實際實現之間有個強依賴
a.f1 = ...         // 更不希望過多瞭解其內部初始化的細節
a.f2 = ...         // ...
b = new(IProductB) // 不希望這裏的代碼與實際實現之間有個強依賴
b.f1 = ...         // 更不希望過多瞭解其內部初始化的細節
b.f2 = ...         // ...

解決方案:
我們首先對產品 A 和 B 進行定義,IProductA 和 IProductB,然後我們可以創建一個工廠,工廠負責創建不同的產品,它們滿足 IProductA 和 IProductB 對產品的要求,那就是合格的產品。

變體方案:
1. 抽象工廠模式:當你想要創建不同風格的不同產品,並且不希望將這些產品綁定到特定的類時,抽象工廠模式能更好地解決問題。

優點:

  1. 工廠模式可隱藏創建產品函數的細節,調用方無需知道如何實現新對象。

  2. 由於通過工廠創建實例,因此在代碼中不需要明確指定類型,從而降低系統對特定類型的依賴。

  3. 它提供了接口或抽象基類,這允許創建多種對象類型,實現這些接口即可。

  4. 工廠模式改進了代碼維護性和可擴展性,使程序更容易修改或添加新類型。

缺點:

  1. 工廠模式的缺點包括,如果不小心使用,可能會引入代碼庫中額外的複雜性和抽象層次。

  2. 工廠模式的過度使用也可能導致對工廠類的方法依賴過多,使系統對創建的對象來源、對象構造過程感知減弱。此外,這種模式還可能在單元測試中帶來複雜性,因爲依賴關係變得更加抽象化,需要用適當的 mock 測試方法。

Source:

// factory.go
package factory

type IFactory interface {
 CreateProductA() IProductA
 CreateProductB() IProductB
}

type Factory struct{}

func NewFactory() IFactory {
 return &Factory{}
}

func (f Factory) CreateProductA() IProductA {
 return &ProductA{}
}

func (f Factory) CreateProductB() IProductB {
 return &ProductB{}
}

// product.go
package factory

type IProductA interface {
 DoSomethingA() error
}

type IProductB interface {
 DoSomethingB() error
}

type ProductA struct{}

func (p ProductA) DoSomethingA() error {
 return nil
}

type ProductB struct{}

func (p ProductB) DoSomethingB() error {
 return nil
}

// factory_test.go
package factory_test

import (
 "testing"

 "factory"
)

func Test_Creational_Factory(t *testing.T) {
 f := factory.NewFactory()
 if err := f.CreateProductA().DoSomethingA(); err != nil {
  t.Errorf("create ProductA error: %v", err)
 }
 if err := f.CreateProductB().DoSomethingB(); err != nil {
  t.Errorf("create ProductB error: %v", err)
 }
}

ps:此處我們優先考慮可讀性,不會太關注編碼標準,如註釋、camelCase 類型名等。我們將多個文件的代碼組織到一個 codeblock 中僅僅是爲了方便閱讀,如果您想測試可以通過 git 下載源碼 github.com/hitzhangjie/go-patterns。

工廠模式是衆多設計模式中比較常見的一種。本文介紹瞭如何藉助工廠模式來分離業務代碼和對象創建邏輯、屏蔽對象創建的內部細節,下面我們將介紹工廠模式的一種變體方案——抽象工廠模式。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/XP-TywpHN6hrgE7-aLu8DQ