設計模式 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. 抽象工廠模式:當你想要創建不同風格的不同產品,並且不希望將這些產品綁定到特定的類時,抽象工廠模式能更好地解決問題。
優點:
-
工廠模式可隱藏創建產品函數的細節,調用方無需知道如何實現新對象。
-
由於通過工廠創建實例,因此在代碼中不需要明確指定類型,從而降低系統對特定類型的依賴。
-
它提供了接口或抽象基類,這允許創建多種對象類型,實現這些接口即可。
-
工廠模式改進了代碼維護性和可擴展性,使程序更容易修改或添加新類型。
缺點:
-
工廠模式的缺點包括,如果不小心使用,可能會引入代碼庫中額外的複雜性和抽象層次。
-
工廠模式的過度使用也可能導致對工廠類的方法依賴過多,使系統對創建的對象來源、對象構造過程感知減弱。此外,這種模式還可能在單元測試中帶來複雜性,因爲依賴關係變得更加抽象化,需要用適當的 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