Golang 工廠模式

1_CdjOgfolLt_GNJYBzI-1QQ.jpeg

簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式(Simple Factory Pattern) :定義一個(gè)工廠類(lèi),它可以根據(jù)參數(shù)的不同返回不同類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法,因此簡(jiǎn)單工廠模式又被稱(chēng)為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類(lèi)創(chuàng)建型模式。

簡(jiǎn)單工廠需要:

  • 工廠結(jié)構(gòu)體
  • 產(chǎn)品接口
  • 產(chǎn)品結(jié)構(gòu)體

示例說(shuō)明

創(chuàng)建一個(gè)餃子店工廠結(jié)構(gòu)體,和餃子類(lèi)的接口。該工廠的其中一個(gè)方法用來(lái)生產(chǎn)不同口味的餃子,如韭菜的豬肉餡的。

type DumplingsShop struct{
    Generate(t string) *Dumplings
}


type Dumplingsinterface interface {
    create()
}

創(chuàng)建肉餡和韭菜餡的餃子結(jié)構(gòu)體,并且實(shí)現(xiàn)對(duì)應(yīng)接口的方法。

  type DumplingsMeat struct{}

  func (* DumplingsMeat)create(){
      fmt.Println("DumplingsMeat create")
  }

  type DumplingsChives struct{}

  func (* DumplingsChives)create(){
      fmt.Println("DumplingsMeat create")
  }

func(* DumplingsShop)Create(type string)*Dumplings{
    switch type {
        case "meat":
        return new(DumplingsMeat)
        case "chives":
        return new(DumplingsChives)
        default:
        return nil
    }
}

工廠實(shí)例化調(diào)用

var type string
dumplingFactory := DumplingsShop{}
type = "meat"
meat := dumplingFactory.Create(type)//返回肉餡餃子對(duì)象
meat.create()
type = "chives"
chives := dumplingFactory.Create(type) //返回韭菜餡餃子對(duì)象
chives.create()

簡(jiǎn)單工廠模式優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn): 工廠類(lèi)是整個(gè)工廠模式的核心,我們只需要傳入給定的信息,就可以創(chuàng)建所需實(shí)例,在多人協(xié)作的時(shí)候,無(wú)需知道對(duì)象之間的內(nèi)部依賴(lài),可以直接創(chuàng)建,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。

  • 缺點(diǎn): 工廠類(lèi)中包含了所有實(shí)例的創(chuàng)建邏輯,一旦這個(gè)工廠類(lèi)出現(xiàn)問(wèn)題,所有實(shí)例都會(huì)受到影響,并且,工廠類(lèi)中生產(chǎn)的產(chǎn)品都基于一個(gè)共同的接口,一旦要添加不同種類(lèi)的產(chǎn)品,這就會(huì)增加工廠類(lèi)的復(fù)雜度,將不同種類(lèi)的產(chǎn)品混合在一起,違背了單一職責(zé),系統(tǒng)的靈活性和可維護(hù)性都會(huì)降低,并且當(dāng)新增產(chǎn)品的時(shí)候,必須要修改工廠類(lèi),違背了『系統(tǒng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉』的原則。

工廠方法模式

工廠方法模式(英語(yǔ):Factory method pattern) 是一種實(shí)現(xiàn)了“工廠”概念的面向?qū)ο笤O(shè)計(jì)模式。就像其他創(chuàng)建型模式一樣,它也是處理在不指定對(duì)象具體類(lèi)型的情況下創(chuàng)建對(duì)象的問(wèn)題。工廠方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類(lèi)來(lái)決定實(shí)例化哪個(gè)類(lèi)。工廠方法讓類(lèi)的實(shí)例化推遲到子類(lèi)中進(jìn)行。”,實(shí)際應(yīng)用中工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。

工廠方法需要:

  • 工廠接口
  • 工廠結(jié)構(gòu)體
  • 產(chǎn)品接口
  • 產(chǎn)品結(jié)構(gòu)體

示例說(shuō)明

創(chuàng)建一個(gè)餃子店工廠接口,和餃子類(lèi)的接口。該工廠用來(lái)生產(chǎn)不同口味的餃子,如韭菜的豬肉餡的。

type DumplingsShopinterface interface{
    Generate(t string) *Dumplings
}

type Dumplingsinterface interface {
    create()
}

創(chuàng)建北京和西安對(duì)應(yīng)餡的餃子結(jié)構(gòu)體,并且實(shí)現(xiàn)對(duì)應(yīng)接口的方法。

  type BeijingDumplingsMeat struct{}

  func (* BeijingDumplingsMeat)create(){
      fmt.Println("BeijingDumplingsMeat create")
  }

  type BeijingDumplingsChives struct{}
  ...
  type XianDumplingsMeat struct{}
  ...
  type XianDumplingsChives struct{}
  ...

創(chuàng)建北京和西安工廠

type BeijingDumplings struct{}
type XianDumplings struct{}

func(* BeijingDumplings)Generate(t string) *Dumplings{
    switch t { 
    case "chives" :
    return new(BeijingDumplingsChives) 
    case "meat" :
    return new(BeijingDumplingsMeat) 
    default:
    return nil
    }
}

func(* XianDumplings)Generate(t string) *Dumplings{
    switch t{}
    case "chives" :
    return new(XianDumplingsChives) 
    case "meat" :
    return new(XianDumplingsMeat) 
    default:
    return nil
}

工廠實(shí)例化調(diào)用

  var DumplingsShopFactory DumplingsShopinterface
  DumplingsShopFactory := new(BeijingDumplings)
  b = DumplingsShopFactory.Generate("meat")  // 傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
  b.create()

  DumplingsShopFactory := new(XianDumplings)
  b = DumplingsShopFactory.Generate("meat") // 同樣傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
  b.create()

工廠方法模式的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn): 符合“開(kāi)閉”原則,具有很強(qiáng)的的擴(kuò)展性、彈性和可維護(hù)性。修改時(shí)只需要添加對(duì)應(yīng)的工廠類(lèi)即可使用了依賴(lài)倒置原則,依賴(lài)抽象而不是具體,使用(客戶(hù))和實(shí)現(xiàn)(具體類(lèi))松耦合。客戶(hù)只需要知道所需產(chǎn)品的具體工廠,而無(wú)須知道具體工廠的創(chuàng)建產(chǎn)品的過(guò)程,甚至不需要知道具體產(chǎn)品的類(lèi)名。

  • 缺點(diǎn): 每增加一個(gè)產(chǎn)品時(shí),都需要一個(gè)具體類(lèi)和一個(gè)具體創(chuàng)建者,使得類(lèi)的個(gè)數(shù)成倍增加,導(dǎo)致系統(tǒng)類(lèi)數(shù)目過(guò)多,復(fù)雜性增加對(duì)簡(jiǎn)單工廠,增加功能修改的是工廠類(lèi);對(duì)工廠方法,增加功能修改的是產(chǎn)品類(lèi)。

抽象工廠模式

抽象工廠模式(英語(yǔ):Abstract factory pattern) 是一種軟件開(kāi)發(fā)設(shè)計(jì)模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨(dú)的工廠封裝起來(lái)。在正常使用中,客戶(hù)端程序需要?jiǎng)?chuàng)建抽象工廠的具體實(shí)現(xiàn),然后使用抽象工廠作為接口來(lái)創(chuàng)建這一主題的具體對(duì)象。客戶(hù)端程序不需要知道(或關(guān)心)它從這些內(nèi)部的工廠方法中獲得對(duì)象的具體類(lèi)型,因?yàn)榭蛻?hù)端程序僅使用這些對(duì)象的通用接口。抽象工廠模式將一組對(duì)象的實(shí)現(xiàn)細(xì)節(jié)與他們的一般使用分離開(kāi)來(lái)。實(shí)際應(yīng)用中針對(duì)的多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。

示例說(shuō)明

創(chuàng)建一個(gè)肉餡餃子店工廠接口和韭菜餡餃子店工廠接口,以及餃子類(lèi)的接口。

type DumplingsShopinterface interface{
    GenerateMeatDumpling() *Dumplingsinterface
    GenerateChivesDumpling() *Dumplingsinterface
}

type Dumplingsinterface interface {
    create()
}

實(shí)現(xiàn)北京肉餡餃子、北京韭菜餃子、西安肉餡餃子、西安韭菜餃子4中實(shí)例對(duì)象。

  type BeijingDumplingsMeat struct{}

  func (* BeijingDumplingsMeat)create(){
      fmt.Println("BeijingDumplingsMeat create")
  }

  type BeijingDumplingsChives struct{}
  ...
  type XianDumplingsMeat struct{}
  ...
  type XianDumplingsChives struct{}
  ...

創(chuàng)建北京和西安工廠

type BeijingDumplingsFactory struct{}
type XianDumplingsFactory struct{}

func(* BeijingDumplingsFactory)GenerateMeatDumpling() *Dumplings{
    return new(BeijingDumplingsMeat) 
    }
}
func(* BeijingDumplingsFactory)GenerateChivesDumpling() *Dumplings{
    return new(BeijingDumplingsChives) 
    }
}

func(* XianDumplingsFactory)GenerateMeatDumpling() *Dumplings{
    return new(XianDumplingsMeat) 
    }
}
func(* XianDumplingsFactory)GenerateChivesDumpling() *Dumplings{
    return new(XianDumplingsChives) 
    }
}

工廠示例調(diào)用

  var DumplingsShopFactory DumplingsShopinterface
  DumplingsShopFactory := new(BeijingDumplingsFactory)
  b = DumplingsShopFactory.GenerateMeatDumpling()  // 傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
  b.create()
  ...

抽象工廠模式的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn): 抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,最主要的優(yōu)點(diǎn)就是可以在類(lèi)的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類(lèi)內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專(zhuān)門(mén)引入一個(gè)新的類(lèi)來(lái)進(jìn)行管理。

  • 缺點(diǎn): 產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類(lèi)都需要進(jìn)行修改。所以使用抽象工廠模式時(shí),對(duì)產(chǎn)品等級(jí)結(jié)構(gòu)的劃分是非常重要的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。