概念
在抽象工廠模式中,是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象
如果抽象工廠退化成生成的對(duì)象無(wú)關(guān)聯(lián)則成為工廠模式。
模式的場(chǎng)景和優(yōu)缺點(diǎn)
使用場(chǎng)景
優(yōu)點(diǎn)
一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象
缺點(diǎn)
產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼
代碼實(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)
}
// NewLoggerFactory 在其他工廠面前又抽象的了一層,是一個(gè)超級(jí)工廠
func NewLoggerFactory(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 = NewLoggerFactory("file")
l.Info("test for file")
s = NewLoggerFactory("sys")
s.Info("test for sys")
}