Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Factory Patterns

0 views

Published on

Overview simple factory, factory method and abstract factory pattern in Chinese.

Published in: Education
  • Be the first to comment

  • Be the first to like this

Factory Patterns

  1. 1. Factory Pattern (2+1種工廠) 2016/12/30 Taka Wang
  2. 2. 為什麼要用 Design Pattern 套用 Pattern 常常會讓程式碼變得更肥,事情變得更複雜 但為了擁抱 ”改變”,開發時期付出比較高的成本 可以帶來架構的彈性,降低維護成本。 好改.好加.不容易出錯 你寫的Code都是誰在維護的?
  3. 3. 某 A, B 兩個客戶,用了我們 Motion 的 Library 去操作 Ethercat 類的運動控制卡A APP1 APP2 ethercat A ethercat A run ./app1 run ./app2 func app1() card = new ethercatA() end func app2() card = new ethercatA() end
  4. 4. 需求改變,客人想比較Ethercat類的兩張運動控制卡 APP1 APP2 ethercat A run ./app1 a run ./app2 b func app1(arg) if arg == “a” card = new ethercatA() else if arg == “b” card = new ethercatB() end func app2(arg) if arg == “a” card = new ethercatA() else if arg == “b” card = new ethercatB() end ethercat B
  5. 5. 如果需求繼續改變 客人要一直修改程式
  6. 6. 透過專門的工廠 生產專門的物件
  7. 7. 透過簡單工廠物件專門生產(實體化) APP1 APP2 run ./app1 a run ./app2 b func app1(arg) card = factory(arg) end func app2(arg) card = factory(arg) end func factory(arg) if arg == “a” card = new ethercatA() else if arg == “b” card = new ethercatB() return card end ethercat A ethercat B
  8. 8. 客人得救了,不用修改程式 (解耦) 我們只要負責修改工廠 (違反OCP)
  9. 9. Simple Factory Pattern <<interface>> MotionCard +Move() ConcreteEthercatA +Move() ConcreteEthercatB +Move() Factory +create(type): MotionCard <<create>> <<create>> implemented implemented use
  10. 10. 客人也想用NPM類的卡!! 給他新工廠
  11. 11. Factory Pattern ConcreteEthercatA +Move() ConcreteEthercatB +Move() EthercatFactory +create(type): MotionCard // call initEthercat() <<create>> <<create>> use NpmFactory +create(type): MotionCard // call initNPM() <<interface>> MotionCard +Move() <<interface>> MotionFactory +create(type): MotionCard implemented ConcreteNpmA +Move() implemented 介面同,底層實作不同
  12. 12. 可以擴充卡別了,Ybus, Zbus..
  13. 13. 重點放在工廠的抽象化(Interface) 簡單工廠只是工廠模式的特例 增加新類運動卡,增加新的工廠 舊的工廠再也不用改(OCP得救了)
  14. 14. 聽說還有一種抽象工廠...
  15. 15. 那 Abstract Factory Pattern 又用在哪裡? ethercat npm softmotion Factory Pattern 已經可以水平增加產品線
  16. 16. 那 Abstract Factory Pattern 又用在哪裡? ethercat npm softmotion linux windows macos 抽象工廠用在擴展平台,這些卡別都要支援 卡別 平台
  17. 17. 不是用來擴展“擷取卡”,”視覺卡”! 記住上頁二維座標的概念
  18. 18. Abstract Factory Pattern WinEthercatA +WinMove() LinuxEthercatB +Move() EthercatFactory +create(type): MotionCard +createWin(type): WinMotionCard use NpmFactory +create(type): MotionCard +createWin(type): WinMotionCard <<interface>> WinMotionCard +WinMove() <<interface>> MotionFactory +create(type): MotionCard +createWin(type): WinMotionCard LinuxNpmA +Move() <<interface>> MotionCard +Move() WinNpmA +WinMove() implemented <<create>> <<create>> implemented
  19. 19. Factory Pattern 複習 ConcreteEthercatA +Move() ConcreteEthercatB +Move() EthercatFactory +create(type): MotionCard // call initEthercat() <<create>> <<create>> use NpmFactory +create(type): MotionCard // call initNPM() <<interface>> MotionCard +Move() <<interface>> MotionFactory +create(type): MotionCard implemented ConcreteNpmA +Move() implemented
  20. 20. 抽象工廠與工廠模式很容易分辨 看看工廠內的Method數,款式 然而,會抓老鼠就是好貓 能夠解耦合就是好工廠 (這兩種工廠隨著維護可能變形)
  21. 21. 上述範例僅為了方便理解與記憶 不代表運動控制卡實際用法
  22. 22. Design Pattern 六大元素 Name:模式名稱 (名詞或動詞) Context:描述問題發生的上下文 Problem:描述問題本身 Force:塑造與影響問題的原因 Solution:解決問題的方法 Resulting Context (Consequence):套用解決問題後的結果 參考:延伸閱讀 [2]
  23. 23. 套到 Gogoro 的 Case Name:Gogoro電動車 Context:空污嚴重,一堆吃油的機車 Problem:人們對於電動機車接受度不高 Force:1. 動力太差。2. 電池充電太久 Solution:高效的馬達與電池交換站的Gogoro完整解決方案 Resulting Context (Consequence):空污改善,但消耗更多能源,機車還是很多
  24. 24. 延伸閱讀 1. 設計模式:簡單工廠、工廠方法、抽象工廠之小結與區別 2. 來一個解決問題的公式 – Design Patterns 這樣學就會了心得 3. Head First Design Patterns 4. Agile Software Development, Principles, Patterns, and Practices

×