golang 设计模式之简单工厂模式
设计模式 刘宇帅 5年前 阅读量: 1642
简单工厂模式(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