gof23創(chuàng)建類模式(golang版)

區(qū)塊鏈的征程已開啟

單例模式

image

Java中的單例模式的實現(xiàn)可以有餓漢式、懶漢式、雙鎖讳窟、靜態(tài)內(nèi)部類让歼、枚舉等形式,在go中如何實現(xiàn)單例呢挪钓,先來最簡單的形式是越,不考慮高并發(fā)的情況下,應(yīng)該怎樣實現(xiàn)

package main

var m *Singleton

type Singleton struct {
}

func GetInstance() *Singleton {
    if m == nil {
        m = &Singleton{}
    }
    return m
}

問題就是并發(fā)的時候會取到多個對象碌上,解決方案
加鎖

package main

import (
    "sync"
)

var instance *Singleton
var lock *sync.Mutex = &sync.Mutex{}

type Singleton struct {
}

func GetInstance() *Singleton {

    lock.Lock()
    defer lock.Unlock()

    if instance != nil {
        instance = &Singleton{}
    }
    return instance
}

go語言特性倚评,支持一種更為方便的加鎖:sync.Once

package main

import (
    "sync"
)

var (
    instance *Singleton
    lock     *sync.Mutex = &sync.Mutex{}
    once sync.Once
)

type Singleton struct {
}

func GetInstance() *Singleton {

    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

簡單工廠模式

簡單工廠模式生產(chǎn)的產(chǎn)品是固定的,要生產(chǎn)蘋果馏予,就有個MakeApple()的方法天梧;要生產(chǎn)橘子,就有個MakeOrange()的方法

package creation

type FruitFactory interface {
    makeApple() Apple
    makeOrange() Orange
}

type Apple struct {
    desc string
}

type Orange struct {
    desc string
}

type Factory struct {
}

func (this Factory) MakeApple() Apple {
    return Apple{"我是一個蘋果"}
}

func (this Factory) MakeOrange() Orange {
    return Orange{"我是一個橘子"}
}

client

package main

import (
    "gof23/creation"
    "fmt"
)

func main() {
    factory := creation.Factory{}

    apple := factory.MakeApple()
    orange := factory.MakeOrange()

    fmt.Println(apple)
    fmt.Println(orange)
}

工廠方法模式

工廠方法模式(Factory Method Pattern)又稱為工廠模式霞丧,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式呢岗,它屬于類創(chuàng)建型模式。在工廠方法模式中蛹尝,工廠父類負責定義創(chuàng)建產(chǎn)品對象的公共接口后豫,而工廠子類則負責生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成突那,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類挫酿。

image
package creation

type FruitPicker interface {
    MakeFruit() Fruit
}
type Fruit interface {
}
type Banana struct {
    desc string
}

type BananaPicker struct {
}

func (this BananaPicker) MakeFruit(fruitName string) Fruit {
    switch fruitName {
    case "banana":
        return Banana{"我是一根香蕉"}
    default:
        return Apple{"可能我是一個蘋果吧"}
    }
}

client

package main

import (
    "gof23/creation"
    "fmt"
)

func main() {
    bananaPicker := creation.BananaPicker{}

    banana := bananaPicker.MakeFruit("banana")
    fmt.Println(banana)
}

抽象工廠模式

在工廠方法模式中具體工廠負責生產(chǎn)具體的產(chǎn)品,每一個具體工廠對應(yīng)一種具體產(chǎn)品愕难,工廠方法也具有唯一性早龟,一般情況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法猫缭。但是有時候我們需要一個工廠可以提供多個產(chǎn)品對象葱弟,而不是單一的產(chǎn)品對象。

為了更清晰地理解工廠方法模式猜丹,需要先引入兩個概念:

產(chǎn)品等級結(jié)構(gòu) :產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)芝加,如一個抽象類是電視機,其子類有海爾電視機射窒、海信電視機妖混、TCL電視機,則抽象電視機與具體品牌的電視機之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu)轮洋,抽象電視機是父類制市,而具體品牌的電視機是其子類。
產(chǎn)品族 :在抽象工廠模式中弊予,產(chǎn)品族是指由同一個工廠生產(chǎn)的祥楣,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的海爾電視機、海爾電冰箱误褪,海爾電視機位于電視機產(chǎn)品等級結(jié)構(gòu)中责鳍,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中。
當系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象兽间,而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要使用抽象工廠模式历葛。

抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。

抽象工廠模式與工廠方法模式最大的區(qū)別在于嘀略,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu)恤溶,而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu),一個工廠等級結(jié)構(gòu)可以負責多個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 帜羊。當一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象時咒程,抽象工廠模式比工廠方法模式更為簡單、有效率讼育。

抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口帐姻,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式奶段,屬于對象創(chuàng)建型模式饥瓷。

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產(chǎn)品
  • Product:具體產(chǎn)品
image

抽象工廠模式側(cè)重于產(chǎn)品族

package creation

type PlantFactory interface {
    MakePlant() Plant
    MakePicker() Picker
}

type Plant interface {
}
type Picker interface {
}

type PearFactory struct {
}

type Pear struct {
    desc string
}

type PearPicker struct {
    desc string
}


func (this PearFactory) MakePlant() Plant {
    return Pear{"我是一個梨"}
}

func (this PearFactory) MakePicker() Picker {
    return PearPicker{"采摘一個梨"}
}

client

package main

import (
    "gof23/creation"
    "fmt"
)

func main() {
    factory := creation.PearFactory{}
    pearPicker := factory.MakePicker()
    pear := factory.MakePlant()

    fmt.Println(pear)
    fmt.Println(pearPicker)
}

建造者模式

建造者模式(Builder Pattern):將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示痹籍。

建造者模式是一步一步創(chuàng)建一個復(fù)雜的對象呢铆,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細節(jié)词裤。建造者模式屬于對象創(chuàng)建型模式刺洒。根據(jù)中文翻譯的不同鳖宾,建造者模式又可以稱為生成器模式吼砂。

建造者模式包含如下角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具體建造者
  • Director:指揮者
  • Product:產(chǎn)品角色
package creation

type Character struct {
    Name string
    Arms string
}

func (p *Character) SetName(name string) {
    p.Name = name
}

func (p *Character) SetArms(arms string) {
    p.Arms = arms
}

func (p Character) GetArms() string {
    return p.Arms
}

func (p Character) GetName() string {
    return p.Name
}

type Builder interface {
    SetName(name string) Builder
    SetArms(arms string) Builder
    Build() *Character
}

type CharacterBuilder struct {
    character *Character
}

func (p *CharacterBuilder) SetName(name string) Builder {
    if p.character == nil {
        p.character = &Character{}
    }
    p.character.SetName(name)
    return p
}

func (p *CharacterBuilder) SetArms(arms string) Builder {
    if p.character == nil {
        p.character = &Character{}
    }
    p.character.SetArms(arms)
    return p
}

func (p *CharacterBuilder) Build() *Character {
    return p.character
}

type Director struct {
    Builder Builder
}

func (p Director) Create(name string, arms string) *Character {
    return p.Builder.SetName(name).SetArms(arms).Build()
}

client

package main

import (
    "fmt"
    "gof23/creation"
)

func main() {
    var builder creation.Builder = &creation.CharacterBuilder{}
    var director *creation.Director = &creation.Director {builder}
    var character *creation.Character = director.Create("loader", "AK47")
    fmt.Println(character.GetName() + "," + character.GetArms())
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鼎文,隨后出現(xiàn)的幾起案子渔肩,更是在濱河造成了極大的恐慌,老刑警劉巖拇惋,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周偎,死亡現(xiàn)場離奇詭異,居然都是意外死亡撑帖,警方通過查閱死者的電腦和手機蓉坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胡嘿,“玉大人蛉艾,你說我怎么就攤上這事。” “怎么了勿侯?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵拓瞪,是天一觀的道長。 經(jīng)常有香客問我助琐,道長祭埂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任兵钮,我火速辦了婚禮蛆橡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢空。我一直安慰自己航罗,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布屁药。 她就那樣靜靜地躺著粥血,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酿箭。 梳的紋絲不亂的頭發(fā)上复亏,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音缭嫡,去河邊找鬼缔御。 笑死,一個胖子當著我的面吹牛妇蛀,可吹牛的內(nèi)容都是我干的耕突。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼评架,長吁一口氣:“原來是場噩夢啊……” “哼眷茁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纵诞,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤上祈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浙芙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體登刺,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年嗡呼,在試婚紗的時候發(fā)現(xiàn)自己被綠了纸俭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡南窗,死狀恐怖揍很,靈堂內(nèi)的尸體忽然破棺而出廊宪,到底是詐尸還是另有隱情,我是刑警寧澤女轿,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布箭启,位于F島的核電站,受9級特大地震影響蛉迹,放射性物質(zhì)發(fā)生泄漏傅寡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一北救、第九天 我趴在偏房一處隱蔽的房頂上張望荐操。 院中可真熱鬧,春花似錦珍策、人聲如沸托启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屯耸。三九已至,卻和暖如春蹭劈,著一層夾襖步出監(jiān)牢的瞬間疗绣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工铺韧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留多矮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓哈打,卻偏偏與公主長得像塔逃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子料仗,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計模式概述 在學習面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點:a) 高內(nèi)聚湾盗、低耦合和單一職能的“沖突”實際上,這兩者...
    彥幀閱讀 3,734評論 0 14
  • 創(chuàng)建型模式 抽象工廠模式(abstract facroty) 3.1模式動機 在工廠方法模式中具體工廠負責生產(chǎn)具體...
    僚機KK閱讀 722評論 0 2
  • 字節(jié)跳動飛書內(nèi)推罢维!北京淹仑、杭州丙挽、武漢肺孵、廣州、深圳颜阐、上海平窘,六大城市等你來投。感興趣的朋友可以私我咨詢&內(nèi)推凳怨,也可以通過...
    盧卡斯嗶嗶嗶閱讀 604評論 0 3
  • 【學習難度:★★★★☆瑰艘,使用頻率:★★★★★】直接出處:抽象工廠模式梳理和學習:https://github.co...
    BruceOuyang閱讀 569評論 0 1
  • 設(shè)計模式匯總 一是鬼、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,903評論 1 15