我想创建一个工厂方法,返回一个实现某个接口的结构的构造函数。去工厂方法返回类型接口,而不是实现接口的结构
下面是一些示例代码,说明我正在使用的模式。
// Generic Interface
type Foo interface {
Bar() string
}
type FooConstructor func(name string) Foo
// A struct that implements Foo
type RealFoo struct {
Name string
}
func (f *RealFoo) Bar() string {
return f.Name
}
func NewRealFoo(name string) Foo {
return &RealFoo{Name: name}
}
// Factory method to return some FooConstructor
func FooFactory() FooConstructor {
// based on some logic, return some Foo constructor
return NewRealFoo
}
func main() {
ff := FooFactory()
f := ff("baz")
fmt.Println(f.Bar())
fmt.Println(f.Name)
}
http://play.golang.org/p/0RzXlIGAs8
当我尝试和未接口中定义我的结构进入一个领域,我得到一个错误:
f.Name undefined (type Foo has no field or method Name)
我相信问题是,我的构造函数func NewRealFoo(name string) Foo
具有作为返回类型的接口,而不是*RealFoo
。但为了将其用作工厂方法的FooConstructor
类型,返回类型必须是Foo
接口。
如何修复我的代码以便我可以访问该字段f.Name
?
没有必要在Go中编程Java。 – Volker
@Volker Go会有什么合适的设计模式? – adam
这是一个奇怪的问题。设计模式有助于实现不能用语言自然表达的东西。你为什么认为你需要一个'FooFactory'?为什么你需要两次(在FooConstructor和FooFactory中)包装一个普通,简单,可理解的'NewRealFoo'?很可能有**没有**需要**;不是,也不是未来。例如。即使没有生产构造函数的工厂,测试工作也很好。 – Volker