抽象工廠模式

概念

在抽象工廠模式中,是圍繞一個(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")

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容