Go 實現常用設計模式(六)工廠模式

pibigstar發表於2019-09-07

意圖:
定義一個建立物件的介面,讓其子類自己決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行
主要解決介面選擇問題

關鍵程式碼:
返回的例項都實現同一介面

應用例項:

  1. 您需要一輛汽車,可以直接從工廠裡面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裡面的具體實現。
  2. Hibernate 換資料庫只需換方言和驅動就可以。

Go實現工廠模式

1. 簡單工廠模式

package simple

import "fmt"

// 簡單工廠模式

type Girl interface {
    weight()
}

// 胖女孩
type FatGirl struct {
}

func (FatGirl) weight() {
    fmt.Println("80kg")
}

// 瘦女孩
type ThinGirl struct {
}

func (ThinGirl) weight() {
    fmt.Println("50kg")
}

type GirlFactory struct {
}

func (*GirlFactory) CreateGirl(like string) Girl {
    if like == "fat" {
        return &FatGirl{}
    } else if like == "thin" {
        return &ThinGirl{}
    }
    return nil
}

2. 抽象工廠模式

package abstract

import (
    "fmt"
)

// 抽象工廠模式

type Girl interface {
    weight()
}

// 中國胖女孩
type FatGirl struct {
}

func (FatGirl) weight() {
    fmt.Println("chinese girl weight: 80kg")
}

// 瘦女孩
type ThinGirl struct {
}

func (ThinGirl) weight() {
    fmt.Println("chinese girl weight: 50kg")
}

type Factory interface {
    CreateGirl(like string) Girl
}

// 中國工廠
type ChineseGirlFactory struct {
}

func (ChineseGirlFactory) CreateGirl(like string) Girl {
    if like == "fat" {
        return &FatGirl{}
    } else if like == "thin" {
        return &ThinGirl{}
    }
    return nil
}

// 美國工廠
type AmericanGirlFactory struct {
}

func (AmericanGirlFactory) CreateGirl(like string) Girl {
    if like == "fat" {
        return &AmericanFatGirl{}
    } else if like == "thin" {
        return &AmericanThainGirl{}
    }
    return nil
}

// 美國胖女孩
type AmericanFatGirl struct {
}

func (AmericanFatGirl) weight() {
    fmt.Println("American weight: 80kg")
}

// 美國瘦女孩
type AmericanThainGirl struct {
}

func (AmericanThainGirl) weight() {
    fmt.Println("American weight: 50kg")
}

// 工廠提供者
type GirlFactoryStore struct {
    factory Factory
}

func (store *GirlFactoryStore) createGirl(like string) Girl {
    return store.factory.CreateGirl(like)
}

具體程式碼

更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star,你的支援,是我最大的動力!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章