抽象工厂模式

概念

在抽象工厂模式中,是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象

如果抽象工厂退化成生成的对象无关联则成为工厂模式。

模式的场景和优缺点

使用场景

优点

一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码

代码实现


package main

import "fmt"

// Logger 是被封装的实际类接口
type Logger interface {
    Info(message string)
}

// LoggerFactory 是工厂接口
type LoggerFactory interface {
    Create() Logger
}

// LoggerBase 是Logger 接口实现的基类,封装公用方法
type LoggerBase struct {
}

// FileLoggerFactory 是 FileLogger 的工厂类
type FileLoggerFactory struct{}

// Create ...
func (FileLoggerFactory) Create() Logger {
    return &FileLogger{
        LoggerBase: &LoggerBase{},
    }
}

// FileLogger Logger 的实际实现,匿名组合来实现继承
type FileLogger struct {
    *LoggerBase
}

// Info 获取结果
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 的实际日志记录实现,匿名组合来实现继承
type SysLogger struct {
    *LoggerBase
}

// Info 获取结果
func (s SysLogger) Info(message string) {
    fmt.Printf("sys logger:%s\n", message)
}

// NewLoggerFactory 在其他工厂面前又抽象的了一层,是一个超级工厂
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")

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容