Go 之基礎速學 (十一) golang 裡簡單工廠模式

huxiaobai_001發表於2020-05-08

簡單工廠模式:
基本特性:
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 協議》,轉載必須註明作者和本文連結

胡軍

相關文章