设计模式笔记2-简单工厂模式(带有自制UML类图)
2.簡單工廠模式
????????簡單工廠模式是屬于創(chuàng)建型模式,是工廠模式的一種。簡單工廠模式是由一 個工廠對象決定創(chuàng)建出哪一種產品類的實例。簡單工廠模式是工廠模式家族 中最簡單實用的模式 ????????簡單工廠模式:定義了一個創(chuàng)建對象的類,由這個類來封裝實例化對象的行 為(代碼) ????????在軟件開發(fā)中,當我們會用到大量的創(chuàng)建某種、某類或者某批對象時,就會使用到工廠模式。?來看一個訂購面包的實例,要求程序具有可擴展性
1)面包的種類很多,(ButterBread, Toast...)
2)制作過程,(prepare, bake, pack)
3)完成面包的訂購功能
2.1? 傳統的方法
思路:
????????需要用到的類,Bread抽象類,ButterBread,Toast具體的實現類,OrderBread面包的訂購類??
? ? ? ? 具體實現,在OrderBread中完成對不同種類面包的訂購
UML類圖?
? ? ? ?? ? ?
?代碼
//Bread.java public abstract class Bread {protected String type;//用于給設置type的值public void setType(String type) {this.type = type;}//準備面包材料public void prepare() {System.out.println("正在準備" + type + "面包的材料");}//烘焙面包public void bake() {System.out.println(type + "正在烘焙中");}//打包面包public void pack() {System.out.println(type + "正在打包中");} }class Toast extends Bread { }class ButterBread extends Bread { }//OrderBread.java public class OrderBread {public void orderBread() {while(true) {String type = getType();Bread bread;if ("Toast".equalsIgnoreCase(type)) {bread = new ButterBread();bread.setType("Toast");} else if ("ButterBread".equalsIgnoreCase(type)) {bread = new Toast();bread.setType("ButterBread");} else {break;}//輸出面包的訂購過程if (bread != null) {bread.prepare();bread.bake();bread.pack();System.out.println("----------------------------");}}}//可以獲取客戶希望訂購的面包種類,就是從控制臺上獲取輸入數據private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input Bread 種類:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}} }//main測試代碼 public static void main(String[] args) {OrderBread orderBread = new OrderBread();orderBread.orderBread(); }?測試結果?
input pizza 種類:
toast
正在準備Toast面包的材料
Toast正在烘焙中
Toast正在打包中
----------------------------
input pizza 種類:
butterbread
正在準備ButterBread面包的材料
ButterBread正在烘焙中
ButterBread正在打包中
----------------------------
input pizza 種類:
存在問題
1.讓我們看看如果增加一種面包(WholeWheatBread)會發(fā)生什么
可以看到圖中兩條紅線的情況,主要的改動是添加了一個類,OrderBread中需要修改if分支的代碼
2.上一種情況看似問題不是很大,指修改了兩個部分,那么如果我們的店鋪擴張,又要添加新的訂購類呢?就會變成如下情況
而這時如果我們在添加一種面包,需要同時改動OrderBread1與OrderBread2,需要改動的地方直接翻倍。
可以看到,這種方式隨著類的增多,是十分不利于擴展和維護的。類越多,增加擴展所需要的改動就越多,稍有不慎就有可能遺漏,發(fā)生錯誤。
2.2? 簡單工廠模式
思路:
新增一個SimpleFactory類,將面包的訂購過程轉移到該類的內部,讓其他的Order類依賴SimpleFactory類,使得各種Order類與面包之間不存在依賴關系。另各種Order類轉而依賴SimpleFactory類。
UML類圖
?代碼(只包括修改或者新增的類)
//OrderBread.java public class OrderBread {private SimpleFactory simpleFactory = new SimpleFactory();public void orderBread() {while (true) {Bread bread = simpleFactory.createBread(getType());//輸出面包的訂購過程if (bread != null) {bread.prepare();bread.bake();bread.pack();System.out.println("----------------------------");} else {System.out.println("訂購失敗");break;}}}//可以獲取客戶希望訂購的面包種類,就是從控制臺上獲取輸入數據private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input Bread 種類:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}} }//新建立的SimpleFactory類 public class SimpleFactory {//將Order類中創(chuàng)建面包的過程移動到此處public Bread createBread(String type) {Bread bread = null;if ("Toast".equalsIgnoreCase(type)) {bread = new ButterBread();bread.setType("Toast");} else if ("ButterBread".equalsIgnoreCase(type)) {bread = new Toast();bread.setType("ButterBread");}return bread;} }擴展需求
當我們要嘗試著添加一個新的Order與面包種類時,只需要在SimpleFactory中新增面包的種類,而不用將每個Order類全部修改。
2.3兩種方法的對比?
傳統方法:簡單易懂,但是不利于擴展與維護。
簡單工廠模式:將創(chuàng)建類的過程交給工廠類來完成,便于擴展新功能。
總結
以上是生活随笔為你收集整理的设计模式笔记2-简单工厂模式(带有自制UML类图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet+html+css+jsp
- 下一篇: 关于两个周期函数的和的周期性的讨论