背景
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)襄垣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
假設(shè)我們?cè)谧鲆豢钚⌒头g軟件,軟件可以將德語(yǔ)、英語(yǔ)、日語(yǔ)都翻譯成目標(biāo)中文,并顯示在前端。
思路
我們會(huì)有三個(gè)具體的語(yǔ)言翻譯結(jié)構(gòu)體,或許以后還有更多,但現(xiàn)在分別是GermanTranslater、EnglishTranslater、JapaneseTranslater,他們都共同實(shí)現(xiàn)了一個(gè)接口Translator。
//翻譯接口
type Translator interface {
Translate(string) string
}
//德語(yǔ)翻譯類(lèi)
type GermanTranslator struct{}
func (*GermanTranslator) Translate(words string) string {
return "德語(yǔ)"
}
//英語(yǔ)翻譯類(lèi)
type EnglishTranslator struct{}
func (*EnglishTranslator) Translate(words string) string {
return "英語(yǔ)"
}
//日語(yǔ)翻譯類(lèi)
type JapaneseTranslator struct{}
func (*JapaneseTranslator) Translate(words string) string {
return "日語(yǔ)"
}
接下來(lái)在程序入口獲取用戶(hù)輸入的文本,并將其翻譯
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", "以下是可翻譯的語(yǔ)言種類(lèi),請(qǐng)輸入代表數(shù)字", "1:德語(yǔ)、2:英語(yǔ)、3:日語(yǔ)")
fmt.Scanln(&lan)
fmt.Println("請(qǐng)輸入要翻譯成中文的文本:")
var inputWords string
fmt.Scanln(&inputWords)
var translator Translator
//根據(jù)不同的語(yǔ)言種類(lèi),實(shí)例化不同的翻譯類(lèi)
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é)果
缺點(diǎn)
改善
為了解決每次新增翻譯類(lèi)都要修改客戶(hù)端的問(wèn)題,我們引入一個(gè)很重要的設(shè)計(jì)原則,可以說(shuō)每種設(shè)計(jì)模式都遵循著這個(gè)設(shè)計(jì)原則。
設(shè)計(jì)原則:找出用中可能需要變化之處,并把它們獨(dú)立出來(lái),不要和那些不需要變化的代碼混在一起。
這樣的話(huà),每次當(dāng)新的需求來(lái)臨,我們只會(huì)改動(dòng)到那些需要變化的地方,而不變的地方就不會(huì)被改動(dòng)影響到。
顯然,翻譯應(yīng)用中容易變化的地方是生成翻譯類(lèi)的邏輯,因此我們把這部分職責(zé)抽出來(lái),把它交給另外一個(gè)類(lèi)去做(一般是一個(gè)靜態(tài)方法),這個(gè)類(lèi)就叫翻譯工廠。而客戶(hù)端再需要生成翻譯類(lèi)實(shí)例時(shí),僅需調(diào)用翻譯工廠提供的方法即可。就算以后翻譯工廠會(huì)提供更多的翻譯類(lèi),也不會(huì)修改到客戶(hù)端的代碼,因此也就有了我們的現(xiàn)在的簡(jiǎn)單工廠模式。
簡(jiǎn)單工廠模式(Simple Factory Pattern)
又稱(chēng)為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類(lèi)創(chuàng)建型模式。在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類(lèi)的實(shí)例。簡(jiǎn)單工廠模式專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。
UML類(lèi)圖
于是我們根據(jù)簡(jiǎn)單工廠模式再完善之前的代碼,如下所示。
工廠代碼
func Create(lan int) Translator {
var translator Translator
//根據(jù)不同的語(yǔ)言種類(lèi),實(shí)例化不同的翻譯類(lèi)
switch lan {
case 1:
translator = new(GermanTranslator)
case 2:
translator = new(EnglishTranslator)
case 3:
translator = new(JapaneseTranslator)
default:
panic("no such translator")
}
return translator
}
客戶(hù)端代碼
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", "以下是可翻譯的語(yǔ)言種類(lèi),請(qǐng)輸入代表數(shù)字", "1:德語(yǔ)、2:英語(yǔ)、3:日語(yǔ)")
fmt.Scanln(&lan)
fmt.Println("請(qǐng)輸入要翻譯成中文的文本:")
var inputWords string
fmt.Scanln(&inputWords)
//客戶(hù)端只關(guān)注如何獲取翻譯類(lèi),而不用關(guān)注創(chuàng)建翻譯類(lèi)的細(xì)節(jié)
translator:=CreateTranslator(lan)
fmt.Println(translator.Translate(inputWords))
}
優(yōu)點(diǎn)
缺點(diǎn)
應(yīng)用場(chǎng)景
當(dāng)在代碼里看到switch的時(shí)候,就應(yīng)該思考是否用簡(jiǎn)單工廠模式。
作者:胡金生
出處:www.aprilboy.com
版權(quán)所有,歡迎保留原文鏈接進(jìn)行轉(zhuǎn)載:)
網(wǎng)站欄目:Golang設(shè)計(jì)模式—簡(jiǎn)單工廠模式(SimpleFactoryPattern)
網(wǎng)頁(yè)路徑:http://redsoil1982.com.cn/article26/gschjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、用戶(hù)體驗(yàn)、靜態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站策劃、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)