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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式(1)--简单工厂模式、策略模式

發(fā)布時(shí)間:2023/12/9 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(1)--简单工厂模式、策略模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
設(shè)計(jì)模式(1)--簡(jiǎn)單工廠模式、策略模式

1. 簡(jiǎn)單工廠模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述簡(jiǎn)單工廠模式的:簡(jiǎn)單工廠模式是類的創(chuàng)建模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。


先放圖再解釋。下圖一是從《大話設(shè)計(jì)模式》中摘出來(lái)的。問(wèn)題是:用任意一種面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺(tái)程序,要求輸入兩個(gè)數(shù)和運(yùn)算符號(hào),得到結(jié)果。

簡(jiǎn)單工廠模式實(shí)現(xiàn)的關(guān)鍵點(diǎn)有兩個(gè):

1. 繼承:定義一個(gè)抽象父類“抽象產(chǎn)品”(Operation類),和一堆具體的子類“實(shí)際產(chǎn)品”(OperationAdd等子類)。抽象父類的設(shè)計(jì)是非常重要的(屬性、方法)

2. 關(guān)聯(lián)關(guān)系:定義一個(gè)“工廠類”,他提供生產(chǎn)產(chǎn)品的方法(圖中createOperate()),然后返回一個(gè)產(chǎn)品(Operation類)。關(guān)聯(lián)關(guān)系使一個(gè)類知道另一個(gè)類的屬性和方法。

解決問(wèn)題:如何實(shí)例化一個(gè)合適的對(duì)象

擴(kuò)展方法:新增“產(chǎn)品”子類,并修改“工廠類”的創(chuàng)建邏輯。

使用方法:使用工廠類創(chuàng)建產(chǎn)品類,然后調(diào)用產(chǎn)品方法或?qū)傩浴?#xff08;客戶端了解兩個(gè)類:工廠類和產(chǎn)品抽象類)

優(yōu)點(diǎn):簡(jiǎn)單。但應(yīng)用很廣哦

缺點(diǎn):每次還需要修改創(chuàng)建邏輯,如果創(chuàng)建邏輯掛掉,整個(gè)就掛了。 而且每次擴(kuò)展都要修改“工廠類”代碼,這就需要重新編譯部署代碼。

使用場(chǎng)景:負(fù)責(zé)創(chuàng)建的對(duì)象比較少;客戶只知道傳入工廠的參數(shù),不關(guān)心對(duì)象創(chuàng)建邏輯。 容易違反高內(nèi)聚低耦合,一般只在很簡(jiǎn)單的情況下使用。

?

圖一. 簡(jiǎn)單工程模式類圖示例

?

?

1 class Test{ 2 public static void main( String[] args ){ 3 Operation oper; 4 OperationFactory operFac = new OperationFactory(); 5 oper = operFac.createOperation("+"); 6 oper.setOpA(1); 7 oper.setOpB(2); 8 oper.getResult(); 9 } 10 } 11 12 class OperationFactory{ 13 public Operation createOperation( String op ){ 14 if( op == "+" ) return new OperationAdd(); 15 if( op == "-" ) return new OperationMinus(); 16 if( op == "*" ) return new OperationMultiply(); 17 return new OperationDivide(); 18 } 19 } 20 21 abstract class Operation{ 22 private double opA; 23 private double opB; 24 25 public double getOpA() { 26 return opA; 27 } 28 29 public void setOpA(double opA) { 30 this.opA = opA; 31 } 32 33 public double getOpB() { 34 return opB; 35 } 36 37 public void setOpB(double opB) { 38 this.opB = opB; 39 } 40 41 public abstract double getResult(); 42 } 43 44 class OperationAdd extends Operation{ 45 public double getResult(){ 46 return getOpA() + getOpB(); 47 } 48 } 49 50 class OperationMinus extends Operation{ 51 public double getResult(){ 52 return getOpA() - getOpB(); 53 } 54 } 55 56 class OperationMultiply extends Operation{ 57 public double getResult(){ 58 return getOpA() * getOpB(); 59 } 60 } 61 62 class OperationDivide extends Operation{ 63 public double getResult(){ 64 if( getOpB() == 0 ) 65 try { 66 throw new Exception("除數(shù)不能為0"); 67 } catch (Exception e) { 68 } 69 return getOpA() / getOpB(); 70 } 71 } View Code

?

2. 策略模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的:

  策略模式屬于對(duì)象的行為模式。其用意是針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。


先放圖再解釋。下圖二是從《大話設(shè)計(jì)模式》中摘出來(lái)的。問(wèn)題實(shí)例是:做一個(gè)商場(chǎng)收銀軟件,根據(jù)客戶購(gòu)買商品的單價(jià)和數(shù)量,向客戶收費(fèi)。而商場(chǎng)可能做活動(dòng):打折、滿減、滿返之類的。?

策略模式實(shí)現(xiàn)的關(guān)鍵點(diǎn)有兩個(gè)?

1. 繼承:實(shí)現(xiàn)某個(gè)功能需要一個(gè)“抽象算法類”(Strategy),算法可以有不同的實(shí)現(xiàn),這些”具體算法類“(ConcreteStrategy)繼承”抽象算法類“的通用接口。(Strategy類的接口設(shè)計(jì)是很重要的)?

2. 聚合關(guān)系:對(duì)算法的使用進(jìn)行封裝,即提供一個(gè)算法的對(duì)外接口(Context類),Context類持有一個(gè)Strategy,把算法的使用和算法本身分開。 ? ? Context里有算法,但這個(gè)算法具體是啥,根據(jù)上下文不同,可能會(huì)是不同的算法。在什么樣的情況下,配置采用哪個(gè)算法來(lái)實(shí)現(xiàn),這就是Context的工作。用戶只需要提供上下文給Context,然后Context就提供調(diào)用算法的接口。這個(gè)時(shí)候,Context和Strategy的關(guān)系更密切,它充當(dāng)了算法與客戶之間的接口,客戶完全接觸不到Strategy類了,但是Context完全了解Strategy。 (聚合關(guān)系中,整體和個(gè)體是“has-a”的關(guān)系,整體部分可分離。)

擴(kuò)展方法:新定義一個(gè)符合Strategy接口定義的算法,在Context里重新添加這一配置(如果采用反射,則可以避免這部分代碼的修改,只需新定義ConcreteStrategy就好了,這個(gè)以后會(huì)講)

使用方法:用戶向Context傳遞上下文,然后調(diào)用Context的算法接口方法就好了。(客戶端了解一個(gè)類:Context類)----這個(gè)可能是要和簡(jiǎn)單工廠模式聯(lián)合使用

優(yōu)點(diǎn)

(1)提供管理相關(guān)算法的協(xié)議。同類算法實(shí)現(xiàn)不同,但有相同的行為特征,還可以把公共代碼放到父類,避免冗余。 ?

(2)封裝算法變化。

?

1 class Context{ 2 Strategy str; 3 public Context( Strategy str ){ 4 this.str = str; 5 } 6 7 public void contextInterface(){ 8 str.algorithmInterface(); 9 } 10 } 11 12 public abstract class Strategy { 13 public abstract void algorithmInterface(); 14 } 15 16 class ConcreteStrategyA extends Strategy{ 17 public void algorithmInterface(){} 18 } 19 20 class ConcreteStrategyB extends Strategy{ 21 public void algorithmInterface(){} 22 } 23 24 class ConcreteStrategyC extends Strategy{ 25 public void algorithmInterface(){} 26 } View Code

?

?

?

?

?圖二.策略模式類圖

?

?3. 總結(jié)

策略模式和簡(jiǎn)單工廠模式的幾點(diǎn)不同:

  • 策略模式有兩層封裝。第一,把具體算法封裝到Strategy:所有實(shí)現(xiàn)相同功能的算法繼承這個(gè)類;第二, 把算法封裝起來(lái),只提供用戶需要的功能:用Context把算法封裝起來(lái),Context定義用戶可以使用的接口,Context確定使用哪個(gè)算法實(shí)現(xiàn)用戶要求的具體功能。
  • 簡(jiǎn)單工廠模式有一層封裝。把產(chǎn)品封裝到Product類,并提供生產(chǎn)產(chǎn)品的方法。即沒有策略模式中的第二層封裝,這里用戶需要完成配置產(chǎn)品的動(dòng)作,雖然使用工廠方法,這個(gè)配置動(dòng)作簡(jiǎn)單了一些,但是用戶還是要執(zhí)行。但是策略模式中,用戶根本就不需要去了解任何配置的事情,也不需要了解算法的存在。
  • 策略模式的應(yīng)用強(qiáng)調(diào):相同行為不同實(shí)現(xiàn)的算法封裝。算法和產(chǎn)品的不同在于,算法原本只是為了實(shí)現(xiàn)對(duì)象的某個(gè)行為,由于實(shí)現(xiàn)經(jīng)常變動(dòng),因此把這種經(jīng)常改變的部分提取出來(lái),作為一個(gè)抽象類封裝起來(lái)。 所以說(shuō)策略模式屬于對(duì)象行為模式。
  • 簡(jiǎn)單工廠模式的應(yīng)用強(qiáng)調(diào):相同類別產(chǎn)品的封裝。產(chǎn)品關(guān)注的是一個(gè)個(gè)的對(duì)象。所以簡(jiǎn)單工廠模式屬于類的創(chuàng)建型模式。
  • 這兩種模式都不注重實(shí)現(xiàn),都是在于如何組織、調(diào)用產(chǎn)品或算法,所以抽象出一些新的類實(shí)現(xiàn)這些管理功能。----設(shè)計(jì)模式有點(diǎn)參考管理學(xué)的東西吧。

?

?

posted on 2015-08-31 16:42 HF_Cherish 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/hf-cherish/p/4759881.html

總結(jié)

以上是生活随笔為你收集整理的设计模式(1)--简单工厂模式、策略模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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