」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 工廠設計模式

工廠設計模式

發佈於2024-07-30
瀏覽:571

Factory Design Pattern

工廠設計模式廣泛應用於物件導向程式設計。它提供了一個用於創建物件的接口,但允許子類別決定實例化哪些類別。在本文中,我們將探討如何在 Golang 中實現工廠模式,了解其好處並分析受日常情況啟發的實際使用範例。

什麼是工廠?

Factory 定義了用於建立物件的接口,但將實例化特定類別的責任委託給子類別。這促進了以解耦和靈活的方式創建對象,使程式碼更加模組化並且更易於維護。

好處

  • 解耦:將物件的創建與其實作分開,促進更乾淨、更模組化的程式碼。
  • 靈活性:無需修改現有程式碼即可輕鬆引入新類別。
  • 維護:使程式碼更易於維護和發展,因為創建邏輯集中在一個地方。

實施工廠

讓我們用一個日常的例子來說明工廠模式:一個訂餐系統,可以創造一些不同類型的餐點(披薩和沙拉)。

1 - 建立介面

首先,我們需要定義一個接口,該接口將由餐食的所有「特定類」實現。

package main

type Food interface {
    Prepare()
}

2 - 建立 ENUM 並實作介面

為了讓我們在開發過程中的生活更輕鬆,並避免在驗證過程中輸入錯誤,一個好的做法是創建一個ENUM 以保持一致性,並且如果我們想在將來添加新食物,也可以更容易

package main

type FoodType int

const (
    PizzaType FoodType = iota
    SaladType
)

type Food interface {
    Prepare()
}

現在讓我們實作 Food 介面。在範例中,我們將只顯示一條訊息,在現實生活中,這就是我們正在處理的物件將被創建的地方

package main

type FoodType int

const (
    PizzaType FoodType = iota
    SaladType
)

type Food interface {
    Prepare()
}

type Pizza struct{}

func (p Pizza) Prepare() {
    fmt.Println("Preparing a Pizza...")
}

type Salad struct{}

func (s Salad) Prepare() {
    fmt.Println("Preparing a Salad...")
}

3 - 創建工廠

現在,讓我們創建一個工廠,該工廠將根據作為參數接收的枚舉來決定要實例化哪個特定類別。

package main

type FoodFactory struct{}

func (f FoodFactory) CreateFood(ft FoodType) Food {
    switch ft {
    case PizzaType:
        return &Pizza{}
    case SaladType:
        return &Salad{}
    default:
        return nil
    }
}

4 - 使用工廠

最後,我們將使用工廠來製作我們的食物。

package main

func main() {
    kitchen := FoodFactory{}

    pizza := kitchen.CreateFood(PizzaType)
    if pizza != nil {
        pizza.Prepare()
    }

    salad := kitchen.CreateFood(SaladType)
    if salad != nil {
        salad.Prepare()
    }
}

這將是運行我們的應用程式後的結果:

Preparing a Pizza...
Preparing a Salad...

我們所做的總結

  1. 食物介面:定義所有特定食物必須遵循的契約,確保它們都實現Prepare方法。
  2. Enum FoodType:使用類型常數來表示不同類型的食物,提高程式碼可讀性和安全性。
  3. 具體類別(Pizza 和 Salad):實作 Food 介面並提供它們自己的Prepare 方法的實作。
  4. FoodFactory:包含物件創建邏輯。 CreateFood 方法根據 FoodType 列舉決定要實例化哪個特定類別。
  5. Main方法:示範了使用工廠建立不同的物件並呼叫其方法,說明了工廠模式提供的靈活性和解耦性。

結論

工廠設計模式是促進物件創建的解耦和靈活性的強大工具。在Golang中,這種模式的實作是直接有效的,允許創建模組化且易於維護的系統。使用介面和工廠,我們可以集中創建邏輯並在新需求出現時簡化程式碼演變。

版本聲明 本文轉載於:https://dev.to/rflpazini/factory-design-pattern-4e9n?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • JavaScript的伴侶
    JavaScript的伴侶
    [2 了解JavaScript承諾 承諾是JavaScript中的一個強大功能,可以簡化處理異步操作的處理。它們提供了一種更清潔,更直觀的方式來處理異步代碼,避免了諸如“回調地獄”之類的問題。 什麼是諾言? 是一個代表異步操作的最終完成(或失敗)及其結果值的對象。它使...
    程式設計 發佈於2025-02-06
  • 如何在整個HTML文檔中設計特定元素類型的第一個實例?
    如何在整個HTML文檔中設計特定元素類型的第一個實例?
    [2單獨使用CSS,整個HTML文檔可能是一個挑戰。 the:第一型偽級僅限於與其父元素中類型的第一個元素匹配。 以下CSS將使用添加的類樣式的第一個段落: }
    程式設計 發佈於2025-02-06
  • 如何使用Flexbox將元素與容器的底部對齊?
    如何使用Flexbox將元素與容器的底部對齊?
    在提供的方案中使用FlexBox 在提供的方案中,您有一個帶有各種子元素的div容器。您的目的是實現一個佈局,而元素垂直堆疊,無論文本的高度如何。 flexbox通過自動保證金提供了解決此問題的解決方案。自動利潤率使剩餘空間在對齊之前的元素中分佈到具有自動邊緣的元素。實現所需佈局的一種方法是使用...
    程式設計 發佈於2025-02-06
  • 如何精確測量.NET中的方法執行時間?
    如何精確測量.NET中的方法執行時間?
    .NET方法執行時間的精確計算 引言: 確定方法的執行時間對於性能優化至關重要。有多種方法可以測量此指標,每種方法都有其優點和缺點。 最佳方法:Stopwatch .NET 中的Stopwatch功能專門用於測量執行時間,被認為是最準確和最直接的方法。使用方法如下: var watch = Sy...
    程式設計 發佈於2025-02-06
  • 如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    [2使用內置的char_length()function。 char_length()和length() 此查詢將從指定的表中檢索所有行,並基於上升順序對它們進行排序指定列的字符長度。帶有更長字符串的行將出現在結果的底部。
    程式設計 發佈於2025-02-06
  • 如何使用Python的記錄模塊實現自定義處理?
    如何使用Python的記錄模塊實現自定義處理?
    使用Python的Loggging Module 確保正確處理和登錄對於疑慮和維護的穩定性至關重要Python應用程序。儘管手動捕獲和記錄異常是一種可行的方法,但它可能乏味且容易出錯。 解決此問題,Python允許您覆蓋默認的異常處理機制,並將其重定向為登錄模塊。這提供了一種方便而係統的方法來捕獲...
    程式設計 發佈於2025-02-06
  • 哪種哈希算法最適合PHP中的安全密碼存儲?
    哪種哈希算法最適合PHP中的安全密碼存儲?
    安全密碼存儲:SHA1 vs MD5 VS SHA256 vs bcrypt bcrypt:首選選擇 通過password_hash()函數: //創建哈希 $ hash = password_hash($ password,password_default,['cost'=> ...
    程式設計 發佈於2025-02-06
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-02-06
  • 如何使用shell_exec()從php執行mySQL *.sql文件?
    如何使用shell_exec()從php執行mySQL *.sql文件?
    在PHP 中執行mysql *.sql文件時,在創建網站數據庫時,您可能會遇到需要執行的方案。 SQL文件從PHP到自動化站點生成。雖然zend_framework可能是有益的,但由於SQL語句中的不一致而直接運行。推薦的方法是使用Shell_exec()調用MySQL工具以執行您的 *.sql腳...
    程式設計 發佈於2025-02-06
  • 為什麼C#沒有用於IEnumerable的for Extension方法?
    為什麼C#沒有用於IEnumerable的for Extension方法?
    [2 [2 最近關於C#缺乏擴展方法的擴展方法] 界面? 有趣的是,只有 list 包括此功能。 [2 這是遺漏的性能優化嗎?還是有更深的根本原因? 幾種理論試圖解釋這一明顯的差距。 [2 一個觀點表明,C#的內置 [2 { item.dosomething(); } 這與擴展...
    程式設計 發佈於2025-02-06
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    解決此問題,我們採用了一個巧妙的CSS解決方案來解決問題:高度:100%; 高度:auto ; 寬度:100%; //對於水平塊 ,使用絕對定位將圖像定位在中心,以object-fit:object-fit :cover in IE和edge消除了問題。現在,圖像將按比例擴展,保持所需的效果而不...
    程式設計 發佈於2025-02-06
  • 如何將LINQ的聚合方法用於有效的字符串串聯?
    如何將LINQ的聚合方法用於有效的字符串串聯?
    與linq 的傳統方法涉及使用stringBuilder並在循環中附加每個字符串。但是,對於更有效的方法,LINQ提供了聚合查詢。 一個匯總查詢是一個函數,該函數獲取值集合併返回標量值。使用點通用,您可以在iEnumerable對像上調用聚合查詢。 與LINQ concateNate strin...
    程式設計 發佈於2025-02-06
  • PHP中整數的最大值是多少?
    PHP中整數的最大值是多少?
    在php中揭示了int值的限制:探索php_int_max 在PHP 未簽名的整數和php 確定整數大小和最大值 64位平台和int values 在摘要中,而PHP中的特定int值範圍取決於平台,典型的最大值大約為通常遇到20億。在與整數合作以確保准確的計算和有效的代碼執行時,了解這些限制至關重...
    程式設計 發佈於2025-02-06
  • 在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在ubuntu 使用debconf-set-selections sudo debconf-set-selections
    程式設計 發佈於2025-02-06
  • 如何在Python中生成具有小數步驟值的範圍?
    如何在Python中生成具有小數步驟值的範圍?
    在range()要克服此限制,建議將步驟值指定為在範圍內生成的點數。 Numpy庫提供了linspace函數,該功能需要多個點和可選的終點值。例如: np.linspace(0,1,10,endpoint = false)#返回[0,0.1,0.2,...,0.9] 如果使用浮點數步驟值,則Num...
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3