溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Golang設(shè)計(jì)模式—簡單工廠模式(Simple Factory Pattern)

發(fā)布時(shí)間:2020-07-17 18:42:28 來源:網(wǎng)絡(luò) 閱讀:318 作者:SpiderShrimp2 欄目:編程語言

Golang設(shè)計(jì)模式——簡單工廠模式

背景

假設(shè)我們在做一款小型翻譯軟件,軟件可以將德語、英語、日語都翻譯成目標(biāo)中文,并顯示在前端。

思路

我們會(huì)有三個(gè)具體的語言翻譯結(jié)構(gòu)體,或許以后還有更多,但現(xiàn)在分別是GermanTranslater、EnglishTranslater、JapaneseTranslater,他們都共同實(shí)現(xiàn)了一個(gè)接口Translator。

//翻譯接口
type Translator interface {
    Translate(string) string
}
//德語翻譯類
type GermanTranslator struct{}

func (*GermanTranslator) Translate(words string) string {

    return "德語"
}
//英語翻譯類
type EnglishTranslator struct{}

func (*EnglishTranslator) Translate(words string) string {

    return "英語"
}
//日語翻譯類
type JapaneseTranslator struct{}

func (*JapaneseTranslator) Translate(words string) string {

    return "日語"
}

接下來在程序入口獲取用戶輸入的文本,并將其翻譯

package main

import (
    "fmt"
    "time"
)

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
        time.Sleep(3 * time.Second)
    }()

    var lan int
    fmt.Printf("%s\r\n%s\r\n", "以下是可翻譯的語言種類,請輸入代表數(shù)字", "1:德語、2:英語、3:日語")
    fmt.Scanln(&lan)

    fmt.Println("請輸入要翻譯成中文的文本:")
    var inputWords string
    fmt.Scanln(&inputWords)

    var translator Translator

    //根據(jù)不同的語言種類,實(shí)例化不同的翻譯類
    switch lan {
    case 1:
        translator = new(GermanTranslator)
    case 2:
        translator = new(EnglishTranslator)
    case 3:
        translator = new(JapaneseTranslator)
    default:
        panic("no such translator")
    }

    fmt.Println(translator.Translate(inputWords))
}

運(yùn)行結(jié)果

Golang設(shè)計(jì)模式—簡單工廠模式(Simple Factory Pattern)

缺點(diǎn)

  1. 違背了開閉原則,以后還可能有法語、俄語、阿拉伯語等其他翻譯器,每一次添加翻譯器都要在客戶端代碼增加對應(yīng)的switch分支,維護(hù)成本高。倘若還有不止一處調(diào)用了創(chuàng)建邏輯,還要維護(hù)多處代碼。
  2. 違背了單一職責(zé)原則,客戶端處理類的職責(zé)應(yīng)該只是負(fù)責(zé)接收用戶的輸入并將其打印,現(xiàn)在還負(fù)責(zé)翻譯類的創(chuàng)建邏輯,導(dǎo)致這個(gè)類的職責(zé)過多。

改善

為了解決每次新增翻譯類都要修改客戶端的問題,我們引入一個(gè)很重要的設(shè)計(jì)原則,可以說每種設(shè)計(jì)模式都遵循著這個(gè)設(shè)計(jì)原則。

設(shè)計(jì)原則:找出用中可能需要變化之處,并把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起。

這樣的話,每次當(dāng)新的需求來臨,我們只會(huì)改動(dòng)到那些需要變化的地方,而不變的地方就不會(huì)被改動(dòng)影響到。

顯然,翻譯應(yīng)用中容易變化的地方是生成翻譯類的邏輯,因此我們把這部分職責(zé)抽出來,把它交給另外一個(gè)類去做(一般是一個(gè)靜態(tài)方法),這個(gè)類就叫翻譯工廠。而客戶端再需要生成翻譯類實(shí)例時(shí),僅需調(diào)用翻譯工廠提供的方法即可。就算以后翻譯工廠會(huì)提供更多的翻譯類,也不會(huì)修改到客戶端的代碼,因此也就有了我們的現(xiàn)在的簡單工廠模式。

簡單工廠模式(Simple Factory Pattern)

又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。簡單工廠模式專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。

UML類圖

Golang設(shè)計(jì)模式—簡單工廠模式(Simple Factory Pattern)

于是我們根據(jù)簡單工廠模式再完善之前的代碼,如下所示。

工廠代碼

func Create(lan int) Translator {
    var translator Translator

    //根據(jù)不同的語言種類,實(shí)例化不同的翻譯類
    switch lan {
    case 1:
        translator = new(GermanTranslator)
    case 2:
        translator = new(EnglishTranslator)
    case 3:
        translator = new(JapaneseTranslator)
    default:
        panic("no such translator")
    }

    return translator
}

客戶端代碼

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
        time.Sleep(3 * time.Second)
    }()

    var lan int
    fmt.Printf("%s\r\n%s\r\n", "以下是可翻譯的語言種類,請輸入代表數(shù)字", "1:德語、2:英語、3:日語")
    fmt.Scanln(&lan)

    fmt.Println("請輸入要翻譯成中文的文本:")
    var inputWords string
    fmt.Scanln(&inputWords)

    //客戶端只關(guān)注如何獲取翻譯類,而不用關(guān)注創(chuàng)建翻譯類的細(xì)節(jié)
    translator:=CreateTranslator(lan)

    fmt.Println(translator.Translate(inputWords))
}

優(yōu)點(diǎn)

  1. 將客戶端和創(chuàng)建產(chǎn)品實(shí)例解耦開來,使客戶端只需要關(guān)注如何獲取實(shí)例。
  2. 符合單一職責(zé)。

缺點(diǎn)

  1. 增加新翻譯類時(shí)還是需要改動(dòng)工廠類,沒有符合開閉原則。

應(yīng)用場景

當(dāng)在代碼里看到switch的時(shí)候,就應(yīng)該思考是否用簡單工廠模式。

作者:胡金生
出處:www.aprilboy.com
版權(quán)所有,歡迎保留原文鏈接進(jìn)行轉(zhuǎn)載:)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI