OO設計模式中的工廠模式

zongzw發表於2024-06-17

讀書筆記:
New 具體類例項即為針對實現程式設計,因為因此而在程式碼中具體化了一個類,將來會有可能帶來修改,而如果針對介面程式設計,即在程式碼中用抽象類代替具體類,則不易於引起修改。

簡單工廠:
嚴格來說不是設計模式,只是程式設計良好規範,將易於變化的部分抽取出來封裝。

工廠方法:
定義了建立物件的框架,實際建立工作由具體的子類完成。子類不同建立的例項型別也不同。用於建立一個物件。透過繼承完成解耦。

抽象工廠:
建立一系列的物件;將建立過程與客戶程式解耦,工廠子類負責一組物件的建立;工廠抽象類中定義了多個工廠方法;多個工廠子類可供客戶程式根據自己的需要作選擇;透過組合實現解耦。
抽象工廠中每一種物件的建立都是用了工廠方法模式,即實際物件的建立延遲到抽象工廠子類中做具體物件建立。

抽象工廠的缺點:
當被建立的物件家族中有新的成員類時,抽象工廠模式的程式面臨全部修改。

依賴倒置:不依賴於具體型別,而依賴於抽象型別,也即依賴於介面。

23/04/2018 12:33 AM

工廠方法 著眼於 物件如何建立。
抽象工廠 著眼於 一組物件的建立過程。

比如用抽象工廠模式建立 UI的各個組成部分:字型 工具欄 邊角 顏色。。
concreteFactoryA 實現了 加粗字型 全集工具欄 圓形邊角 紅色風格
客戶端程式呼叫concreteFactoryA就能得到這個組合樣式。

工廠方法是工廠模式的一個維度。將建立延遲到子類。

2024/6/17 11:25

簡單工廠:就是用同一個工廠類,根據要求(if-else)生產不同的例項
抽象工廠:用具體的工廠類 去生產 具體的例項。
工廠方法:看上去,和抽象工廠沒有本質的差別,只是建立 單個具體例項。。

package main

import "log"

type AbstractFactory interface {
	CreateA()
	CreateB()
}

type Factory1 struct{}
type Factory2 struct{}

func (f *Factory1) CreateA() {
	log.Println("A1")
}
func (f *Factory1) CreateB() {
	log.Println("B1")
}
func (f *Factory2) CreateA() {
	log.Println("A2")
}
func (f *Factory2) CreateB() {
	log.Println("B2")
}

var (
	// check type struct implemented all interface's methods.
	_ AbstractFactory = (*Factory1)(nil)
)

/**
 * 簡單工廠:就是用同一個工廠類,根據要求(if-else)生產不同的例項。
 * 抽象工廠:抽象工廠定義框架,用具體的工廠類 去生產 具體的例項。
 * 工廠方法:和抽象工廠沒有本質的差別,只是,具體工廠僅用於建立單個具體例項。
 */
func main() {
	var f AbstractFactory

	f = &Factory1{}
	f.CreateA()
	f.CreateB()

	f = &Factory2{}
	f.CreateA()
	f.CreateB()

}

相關文章