簡單工廠模式:
基本特性:
1.“掩蓋”new過程
2.會有一個工廠類,且一般有個方法接受引數,根據引數來決定例項化什麼類
在Go 之基礎速學 (十) golang 裡介面的實現 這篇文章當中我們講到介面的實現方式發現如下程式碼:
var service services.IService = new(services.IServiceOne) fmt.Println(service.Get(12)) var serviceTow services.IService = &services.IServiceTwo{} fmt.Println(serviceTow.Get(13))
new(services.IServiceOne)以及&services.IServiceTwo{}頻繁的使用是不是很難看啊,其實今天我們講到的是為了讓程式碼更加的規範化管理,更加舒適合理,當然你也可以不這麼做,但是下邊要講到的可能對小白比較有用,牽扯到其他的幾個知識要點
//main.go檔案 package main import ( "com.huxiaobai/services" "fmt" "github.com/pquerna/ffjson/ffjson" ) func main(){ //介面的實現 (簡單工廠模式的實現) 案例一 //下邊兩個一起的 要麼通過&符號傳遞記憶體地址進去 也就是指標 要麼通過new也是獲取到的記憶體指標 效果是一樣的 //var serviceFc services.IService = (&services.ServiceFactory{}).Create("one") //var serviceFc services.IService = new(services.ServiceFactory).Create("one") //這種方式是通過呼叫一個普通函式獲取返回 return &ServiceFactory{} 的指標來實現的 是為了徹底的保證你看不到new關鍵字的存在 var serviceFc services.IService = services.NewServiceFactory().Create("one") fmt.Println(serviceFc.Get(123)) }
//IService.go檔案: package services //就這麼簡單 宣告介面 interfacetype IService interface { Get(id int) string } //簡單工廠模式 結構體 type ServiceFactory struct { } //簡單工廠模式結構體裡面的方法 要求傳入的是指標型別 返回的是介面型別 func (sf *ServiceFactory) Create(name string) IService { switch name { case "one": return &IServiceOne{} case "two": return &IServiceTwo{} default: return nil } } //普通函式 要求返回的是指標型別 func NewServiceFactory() *ServiceFactory { //要麼通過new 要麼通過&符號獲取記憶體地址也就是指標來返回 //return new(ServiceFactory) return &ServiceFactory{} }
//IServiceOne檔案: package services type IServiceOne struct { } func (one *IServiceOne) Get(id int) string { return "單挑新聞內容one" }
//IServiceTwo檔案: package services type IServiceTwo struct { } func (two *IServiceTwo) Get(id int) string { return "單挑新聞內容two"; }
主要看程式碼裡面的註釋,看不懂我也沒辦法的啦!
本作品採用《CC 協議》,轉載必須註明作者和本文連結