工廠模式Factory · 設計模式學習筆記
文章推薦指數: 80 %
工廠模式Factory Pattern. 目的:提供一個工廠介面,將產生實體的程式碼交由子類別各自實現. 進化的新手村. 剛才的簡單工廠模式因為只有一個工廠,要新增產品種類要 ...
設計模式學習筆記-StudyDesignPatternInJava
Introduction
物件導向設計基本原則-SOLID
單例模式Singleton
簡單工廠模式SimpleFactory
工廠模式Factory
抽象工廠模式AbstractFactory1
抽象工廠模式AbstractFactory2
策略模式Strategy
策略模式實例-排序
策略模式與簡單工廠模式有什麼不同?
PoweredbyGitBook
工廠模式Factory
工廠模式FactoryPattern
目的:提供一個工廠介面,將產生實體的程式碼交由子類別各自實現
進化的新手村
剛才的簡單工廠模式因為只有一個工廠,要新增產品種類要直接修改工廠類別裡面的程式碼,直接破壞了開放/封閉原則,在工廠模式中,我們將工廠(Factory)提升為一種抽象的概念,也就是說現在工廠是一個介面(Interface),工廠介面只會規範實體工廠類別(ConcreteFactory)應該返回哪種產品,實際上要如何製作產品則交給實體工廠來實作。
現在訓練營已經被提升為一種概念,訓練各種冒險者的過程應該是不一樣的,不能像以前這樣一個訓練營訓練出所有種類的冒險者,例如培訓近身格鬥的鬥士與躲遠遠放冷箭的弓箭手應該是不同的培訓過程。
新手村現在建立了兩座訓練營,弓箭手訓練營、鬥士訓練營,相信看名子就知道這兩種訓練訓練營的功能是什麼。
如此一來,如果想要修改弓箭手的訓練流程,就修改弓箭手訓練營裡面的程式碼即可,不用擔心是否會影響鬥士訓練營的運作,而且如要增加冒險者的類別,例如說劍士,只要新增一座劍士訓練營,完全不會改動到抽象訓練營與本來的實體訓練營。
類別圖
程式碼
產品介面與產品實作類別
//冒險者(Product)
publicinterfaceAdventurer{
//告訴別人你是哪種冒險者
StringgetType();}
}
//弓箭手(ConcreteProduct)
publicclassArcherimplementsAdventurer{
@Override
publicStringgetType(){
System.out.println("我是弓箭手");
returnthis.getClass().getSimpleName();
}
}
//鬥士(ConcreteProduct)
publicclassWarriorimplementsAdventurer{
@Override
publicStringgetType(){
System.out.println("我是鬥士");
returnthis.getClass().getSimpleName();
}
}
工廠介面與工廠實作類別
/**
*冒險者訓練營介面(Factory)-這邊只是一個概念或規範,要訓練什麼,怎麼訓練留給子類別實作
*/
publicinterfaceTrainingCamp{
//訓練冒險者的過程,訓練後請給我一個冒險者
publicAdventurertrainAdventurer();
}
/**
*弓箭手訓練營(ConcreteFactory)
*/
publicclassArcherTrainingCampimplementsTrainingCamp{
@Override
publicAdventurertrainAdventurer(){
System.out.println("訓練一個弓箭手");
returnnewArcher();
}
}
/**
*鬥士訓練營(ConcreteFactory)
*/
publicclassWarriorTrainingCampimplementsTrainingCamp{
@Override
publicAdventurertrainAdventurer(){
System.out.println("訓練一個鬥士");
returnnewWarrior();
}
}
測試碼:
/**
*冒險者訓練營測試
*/
publicclassTrainingCampTest{
@Test
publicvoidtest(){
System.out.println("==========工廠模式測試==========");
//訓練營訓練冒險者
//先用弓箭手訓練營訓練弓箭手
TrainingCamptrainingCamp=newArcherTrainingCamp();
AdventurermemberA=trainingCamp.trainAdventurer();
//用鬥士訓練營訓練鬥士
trainingCamp=newWarriorTrainingCamp();
AdventurermemberB=trainingCamp.trainAdventurer();
//看看是不是真的訓練出我們想要的冒險者
Assert.assertEquals(memberA.getType(),"Archer");
Assert.assertEquals(memberB.getType(),"Warrior");
//memberB應該是Warrior不是Knight,因此下面這行會報錯
Assert.assertEquals(memberB.getType(),"Knight");
}
}
測試結果:
==========工廠模式測試==========
訓練一個弓箭手
訓練一個鬥士
我是弓箭手
我是鬥士
簡單工廠模式與工廠模式比較:
簡單工廠模式:工廠直接負責管理所有的產品,利用ifelse或switchcase判斷式來產生產品。
工廠模式:工廠提升為一個概念,實際上產生產品的是實作工廠概念的實體工廠。
resultsmatching""
Noresultsmatching""
延伸文章資訊
- 1這可能是你第一個接觸到的Design Pattern - 叡揚資訊
簡介這次要跟大家介紹的是Composite Pattern,這是GoF(Gang of Four)經典 ... 此範例是採用C#實作簡易版的公司職員管理,下圖為UML類別圖,僅有2個 ...
- 2Chapter3: 策略模式(Strategy Pattern)
1.Strategy Pattern. 2.Strategy Pattern Example ... 若使用策略模式來套用上述範例, 則可以解決繼承所帶來的問題, 也可以重複使用已經寫好的程式碼:.
- 3設計模式學習筆記- Study Design Pattern In Java
... 模式的聖經Design Patterns : Elements of Re-usable Object-Oriented Software,發現這本書很難, 只好先放棄,真正開始是從大話...
- 4[Design Pattern-Python]設計模式-前言. 經驗分享 - Medium
“[Design Patterns-Python]設計模式-前言” is published by Daniel ... 自己實作過這些設計模式,我只要把模式的概念以及程式的範例解釋就能成一 ...
- 5媽! 我學會Design Pattern了- 23種Design Pattern範例#7 - GitHub
所以我整理了一些較簡單的Javascript Sample Code跟說明在這邊,希望可以幫助到想學Design Pattern的人。 總體來說設計模式分為3大類:. 創建型模式,共5 ...