golang 设计模式之简单工厂模式

设计模式 刘宇帅 3年前 阅读量: 645

简单工厂模式(Sample Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

介绍

  • 意图:提供一个创建对象的工厂,工厂类函数会根据不同的参数创建实现了同一接口的不同产品类。
  • 解决问题:主要解决接口选择的问题
  • 优点
    • 如果要创建一个产品对象只要知道其名字就可以了,不需要关心具体实现
    • 可扩展,只需要实现一个产品类就可以了
  • 缺点
    • 不同的实现都需要实现一个具体的类,提升系统复杂性
    • 新增产品类的时候需要修改创建对象的工厂类,增加系统依赖
  • 可应用场景举例
    • 日志:日志可被写入文件、api 接口、数据库、syslog 等不同的地方

实现

这里以日志场景实现

结构

代码

创建一个日志接口

// 日志接口
type Logger interface {
    Name() string
}

SysLog 的实现

// 系统日志
type SysLog struct {
}

func (s *SysLog) Name() string {
    return "sysLog"
}

FileLog 的实现

// 文件日志
type FileLog struct {
}

func (f *FileLog) Name() string {
    return "fileLog"
}

面向用户的工厂类实现

type LoggerFactory struct {
}

func (l *LoggerFactory) GetLogger(name string) (Logger, error) {
    switch name {
    case "sysLog":
        return new(SysLog), nil
    case "fileLog":
        return new(FileLog), nil
    default:
        return nil, fmt.Errorf("logger %s not found", name)
    }
}

测试用例

func TestSimpleFactory(t *testing.T) {
    loggerFactory := new(LoggerFactory)
    sysLog, err := loggerFactory.GetLogger("sysLog")
    if err != nil {
        t.Errorf("get SysLog error: %s", err.Error())
    }
    if sysLog.Name() != "sysLog" {
        t.Errorf("get SysLog name error: %s", sysLog.Name())
    }

    fileLog, err := loggerFactory.GetLogger("fileLog")

    if err != nil {
        t.Errorf("get FileLog error: %s", err.Error())
    }

    if fileLog.Name() != "fileLog" {
        t.Errorf("get FileLog name error: %s", fileLog.Name())
    }
}

测试输出:

> $ go test
PASS
ok      github.com/yushuailiu/go-algorithm/pattern/simpleFactory    0.005s

源码地址

提示

功能待开通!


暂无评论~