我想創建一個工廠方法,返回一個實現某個接口的結構的構造函數。去工廠方法返回類型接口,而不是實現接口的結構
下面是一些示例代碼,說明我正在使用的模式。
// 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