日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式笔记2-简单工厂模式(带有自制UML类图)

發(fā)布時間:2023/12/14 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式笔记2-简单工厂模式(带有自制UML类图) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2.簡單工廠模式

????????簡單工廠模式是屬于創(chuàng)建型模式,是工廠模式的一種。簡單工廠模式是由一 個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。簡單工廠模式是工廠模式家族 中最簡單實用的模式 ????????簡單工廠模式:定義了一個創(chuàng)建對象的類,由這個類來封裝實例化對象的行 (代碼) ????????在軟件開發(fā)中,當我們會用到大量的創(chuàng)建某種、某類或者某批對象時,就會使用到工廠模式。?

來看一個訂購面包的實例,要求程序具有可擴展性

1)面包的種類很多,(ButterBread, Toast...)

2)制作過程,(prepare, bake, pack)

3)完成面包的訂購功能

2.1? 傳統(tǒng)的方法

思路:

????????需要用到的類,Bread抽象類,ButterBread,Toast具體的實現(xiàn)類,OrderBread面包的訂購類??

? ? ? ? 具體實現(xiàn),在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("----------------------------");}}}//可以獲取客戶希望訂購的面包種類,就是從控制臺上獲取輸入數(shù)據(jù)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類,將面包的訂購過程轉移到該類的內(nèi)部,讓其他的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;}}}//可以獲取客戶希望訂購的面包種類,就是從控制臺上獲取輸入數(shù)據(jù)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兩種方法的對比?

傳統(tǒng)方法:簡單易懂,但是不利于擴展與維護。

簡單工廠模式:將創(chuàng)建類的過程交給工廠類來完成,便于擴展新功能。

總結

以上是生活随笔為你收集整理的设计模式笔记2-简单工厂模式(带有自制UML类图)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。