簡單工廠模式並不屬於GoF的23個經典設計模式,但一般將它做爲學習其餘工廠模式的基礎,它的設計思想很簡單,其基本流程以下:設計模式
首先將須要建立的各類不一樣對象(例如各類不一樣的Food對象)的相關代碼封裝到不一樣的類中,這些類稱爲具體產品類,而將它們公共的代碼進行抽象和提取後封裝在一個抽象產品類中,每個具體產品類都是抽象產品類的子類;而後提供一個工廠類用於建立各類產品,在工廠類中提供一個建立產品的工廠方法,該方法能夠根據所傳入的參數不一樣建立不一樣的具體產品對象;客戶端只需調用工廠類的工廠方法並傳入相應的參數便可獲得一個產品對象。ide
需求快餐店的食物,目前有漢堡,粥,須要向顧客展現價格。學習
修改前package SimpleFactory import "fmt" type Food struct { price int type_ string } func NewFood(t string) *Food { if t == "hamburger"{ return &Food{ type_: t, price: 13, } }else if t == "porridge"{ return &Food{ type_: t, price: 8, } } return nil } func (f Food)Display() { if f.type_ == "hamburger"{ fmt.Println("I'm Hamburger, price is ",f.price) }else if f.type_ == "porridge"{ fmt.Println("I'm Porridge, price is ",f.price) } }
能夠看出有幾個問題測試
package SimpleFactory import ( "fmt" ) type Foods interface { Display() } type Hamburger struct { price int } func (h Hamburger) Display() { fmt.Println("I'm Hamburger, price is ",h.price) } type Porridge struct { price int } func (p Porridge) Display() { fmt.Println("I'm Porridge, price is ",p.price) } type FoodsFactory struct { } func (f FoodsFactory)GetFood(name string) Foods { switch name { case "hamburger": return & Hamburger{price: 10} case "porridge": return &Porridge{price: 8} default: return nil } }
相對於修改前,增長一個食品時只須要新增一個類,實現Display方法便可,不對原來的漢堡和粥的代碼修改,維護工廠類的GetFood方法便可。
簡化:去除工廠類,將工廠方法(GetFood)與抽象類/接口(Foods)合併設計
package SimpleFactory import ( "fmt" "testing" ) func TestWrong(t *testing.T) { ham := NewFood("hamburger") ham.Display() por := NewFood("porridge") por.Display() wrong := NewFood("not exist") fmt.Println(wrong) } func TestSimple(t *testing.T) { f := FoodsFactory{} ham := f.GetFood("hamburger") ham.Display() por := f.GetFood("porridge") por.Display() wrong := f.GetFood("not exist") fmt.Println(wrong) }
總結=== RUN TestSimple
I’m Hamburger, price is 10
I’m Porridge, price is 8
— PASS: TestSimple (0.00s)
PASS對象