您可於此 design_pattern repo 下載 Design Pattern 系列程式碼。

引言:一個全球化的挑戰

想像一下,你的飲料點餐系統在全球範圍內大受歡迎。隨著業務的擴展,你面臨著一個挑戰:如何滿足不同地區顧客的特定偏好?

上一篇我們利用簡單工廠模式模式成功地將需要變動 以及 不需變動 的程式碼分離。今天,我們將探討如何進一步提升我們系統的靈活性和擴展性。

需求:滿足全球化的味蕾

飲料點餐系統受到客戶的喜愛,業績非常好,於是客戶在世界各地迅速擴店。但很快的問題出現了——不同地區的顧客有著不同的偏好。

  • 案例分析:
    • 美國喜歡錫蘭紅茶
    • 歐洲喜歡伯爵紅茶

我們的目標是,不增加過多成本的同時,滿足這些多樣化的需求。 (成本考量我們不將所有紅茶種類都加入菜單,只用最符合當地口味的茶葉製作紅茶)

物件導向分析(OOA)

design_pattern_factory_method_pattern_uml_1

於是我們修改簡單工廠的程式碼,新增 USBeverageFactory 及 EUBeverageFactory 來製作符合美國及歐洲當地口味的飲品

察覺 Forces

這樣做雖然可以滿足分店從不同工廠取得該地區的飲品,但每當有新的分店加入,就必須動到 BeverageShop 的程式碼來添加新的分店工廠,違反了 Open Closed Principle

套用 Solution

看清楚整個 Context,察覺 Forces 後,就可以套用 Factory Method Pattern 來解決這個問題

先來看一下 Factory Method Pattern 的 UML

design_pattern_factory_method_pattern_uml_2

提供一個介面用來創建物件,真正實體化的類別由子類別實作決定。 讓我們修改一下上面的 UML

design_pattern_factory_method_pattern_uml_3

如此我們就得到了一個全新的 Resulting Context

物件導向程式設計 (OOP)

再來我們就可以開始進行物件導向程式開發

透過工廠方法模式,我們透過將工廠抽象化,達到可擴充性,之後如果要拓展其他分店像是日本分店,只需新增一個 JPBeverageFactory ,就能創建能做出符合日本人口味的飲料工廠,而不需修改到其他不需變動的程式碼。

總結

通過工廠方法模式,我們可以在不犧牲系統整體架構的前提下,靈活地擴展我們的產品線,滿足全球化市場的需求。這不僅提升了我們系統的可維護性和擴展性,也為我們的業務帶來了更大的機會。

我們來看看工廠方法用到哪些 Design Principle

  • Encapsulate What Varies
  • Loose Coupling
  • Program to Interfaces
  • Single Responsibility Principle
  • Open Closed Principle
  • Dependency Inversion Principle

下一篇要介紹最後一個工廠模式 Abstract Factory Pattern 抽象工廠模式

參考

Note: 如果有任何建議、問題或不同想法,歡迎留言或寄信給我,可以一起討論進步成長🙂

Leave a comment