概念
在工廠模式中积锅,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯昼扛,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象辜伟。
工廠方法模式使用子類的方式延遲生成對(duì)象到子類中實(shí)現(xiàn)仇穗。Go中不存在繼承 所以使用匿名組合來(lái)實(shí)現(xiàn)
模式的場(chǎng)景和優(yōu)缺點(diǎn)
使用場(chǎng)景
1、日志記錄器:記錄可能記錄到本地硬盤谆刨、系統(tǒng)事件塘娶、遠(yuǎn)程服務(wù)器等,用戶可以選擇記錄日志到什么地方
2痊夭、數(shù)據(jù)庫(kù)訪問血柳,當(dāng)用戶不知道最后系統(tǒng)采用哪一類數(shù)據(jù)庫(kù),以及數(shù)據(jù)庫(kù)可能有變化時(shí)生兆。 3、設(shè)計(jì)一個(gè)連接服務(wù)器的框架膝宁,需要三個(gè)協(xié)議鸦难,"POP3"、"IMAP"员淫、"HTTP"合蔽,可以把這三個(gè)作為產(chǎn)品類,共同實(shí)現(xiàn)一個(gè)接口
優(yōu)點(diǎn)
1介返、一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象拴事,只要知道其名稱就可以了
2、擴(kuò)展性高圣蝎,如果想增加一個(gè)產(chǎn)品刃宵,只要擴(kuò)展一個(gè)工廠類就可以
3、屏蔽產(chǎn)品的具體實(shí)現(xiàn)徘公,調(diào)用者只關(guān)心產(chǎn)品的接口
缺點(diǎn)
每次增加一個(gè)產(chǎn)品時(shí)牲证,都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠,使得系統(tǒng)中類的個(gè)數(shù)成倍增加关面,在一定程度上增加了系統(tǒng)的復(fù)雜度坦袍,同時(shí)也增加了系統(tǒng)具體類的依賴十厢。這并不是什么好事。
代碼實(shí)現(xiàn)
package main
import "fmt"
// Logger 是被封裝的實(shí)際類接口
type Logger interface {
Info(message string)
}
// LoggerFactory 是工廠接口
type LoggerFactory interface {
Create() Logger
}
// LoggerBase 是Logger 接口實(shí)現(xiàn)的基類捂齐,封裝公用方法
type LoggerBase struct {
}
// FileLoggerFactory 是 FileLogger 的工廠類
type FileLoggerFactory struct{}
// Create ...
func (FileLoggerFactory) Create() Logger {
return &FileLogger{
LoggerBase: &LoggerBase{},
}
}
// FileLogger Logger 的實(shí)際實(shí)現(xiàn),匿名組合來(lái)實(shí)現(xiàn)繼承
type FileLogger struct {
*LoggerBase
}
// Info 獲取結(jié)果
func (f FileLogger) Info(message string) {
fmt.Printf("file logger:%s\n", message)
}
// SysLoggerFactory 是 SysLogger 的工廠類
type SysLoggerFactory struct{}
// Create ...
func (SysLoggerFactory) Create() Logger {
return &SysLogger{
LoggerBase: &LoggerBase{},
}
}
// SysLogger Logger 的實(shí)際日志記錄實(shí)現(xiàn),匿名組合來(lái)實(shí)現(xiàn)繼承
type SysLogger struct {
*LoggerBase
}
// Info 獲取結(jié)果
func (s SysLogger) Info(message string) {
fmt.Printf("sys logger:%s\n", message)
}
// NewLogger ...
func NewLogger(t string) (l Logger) {
switch t {
case "file":
FileLoggerFactory := FileLoggerFactory{}
l = FileLoggerFactory.Create()
case "sys":
SysLoggerFactory := SysLoggerFactory{}
l = SysLoggerFactory.Create()
}
return
}
func main() {
var l Logger
var s Logger
l = NewLogger("file")
l.Info("test for file")
s = NewLogger("sys")
s.Info("test for sys")
}