设计模式(1)--简单工厂模式、策略模式
1. 簡單工廠模式
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述簡單工廠模式的:簡單工廠模式是類的創建模式,又叫做靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。
先放圖再解釋。下圖一是從《大話設計模式》中摘出來的。問題是:用任意一種面向對象語言實現一個計算器控制臺程序,要求輸入兩個數和運算符號,得到結果。
簡單工廠模式實現的關鍵點有兩個:
1. 繼承:定義一個抽象父類“抽象產品”(Operation類),和一堆具體的子類“實際產品”(OperationAdd等子類)。抽象父類的設計是非常重要的(屬性、方法)
2. 關聯關系:定義一個“工廠類”,他提供生產產品的方法(圖中createOperate()),然后返回一個產品(Operation類)。關聯關系使一個類知道另一個類的屬性和方法。
解決問題:如何實例化一個合適的對象
擴展方法:新增“產品”子類,并修改“工廠類”的創建邏輯。
使用方法:使用工廠類創建產品類,然后調用產品方法或屬性。(客戶端了解兩個類:工廠類和產品抽象類)
優點:簡單。但應用很廣哦
缺點:每次還需要修改創建邏輯,如果創建邏輯掛掉,整個就掛了。 而且每次擴展都要修改“工廠類”代碼,這就需要重新編譯部署代碼。
使用場景:負責創建的對象比較少;客戶只知道傳入工廠的參數,不關心對象創建邏輯。 容易違反高內聚低耦合,一般只在很簡單的情況下使用。
?
圖一. 簡單工程模式類圖示例
?
?
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("除數不能為0"); 67 } catch (Exception e) { 68 } 69 return getOpA() / getOpB(); 70 } 71 } View Code?
2. 策略模式
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的:
策略模式屬于對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。
先放圖再解釋。下圖二是從《大話設計模式》中摘出來的。問題實例是:做一個商場收銀軟件,根據客戶購買商品的單價和數量,向客戶收費。而商場可能做活動:打折、滿減、滿返之類的。?
策略模式實現的關鍵點有兩個:?
1. 繼承:實現某個功能需要一個“抽象算法類”(Strategy),算法可以有不同的實現,這些”具體算法類“(ConcreteStrategy)繼承”抽象算法類“的通用接口。(Strategy類的接口設計是很重要的)?
2. 聚合關系:對算法的使用進行封裝,即提供一個算法的對外接口(Context類),Context類持有一個Strategy,把算法的使用和算法本身分開。 ? ? Context里有算法,但這個算法具體是啥,根據上下文不同,可能會是不同的算法。在什么樣的情況下,配置采用哪個算法來實現,這就是Context的工作。用戶只需要提供上下文給Context,然后Context就提供調用算法的接口。這個時候,Context和Strategy的關系更密切,它充當了算法與客戶之間的接口,客戶完全接觸不到Strategy類了,但是Context完全了解Strategy。 (聚合關系中,整體和個體是“has-a”的關系,整體部分可分離。)
擴展方法:新定義一個符合Strategy接口定義的算法,在Context里重新添加這一配置(如果采用反射,則可以避免這部分代碼的修改,只需新定義ConcreteStrategy就好了,這個以后會講)
使用方法:用戶向Context傳遞上下文,然后調用Context的算法接口方法就好了。(客戶端了解一個類:Context類)----這個可能是要和簡單工廠模式聯合使用
優點:
(1)提供管理相關算法的協議。同類算法實現不同,但有相同的行為特征,還可以把公共代碼放到父類,避免冗余。 ?
(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. 總結
策略模式和簡單工廠模式的幾點不同:
- 策略模式有兩層封裝。第一,把具體算法封裝到Strategy:所有實現相同功能的算法繼承這個類;第二, 把算法封裝起來,只提供用戶需要的功能:用Context把算法封裝起來,Context定義用戶可以使用的接口,Context確定使用哪個算法實現用戶要求的具體功能。
- 簡單工廠模式有一層封裝。把產品封裝到Product類,并提供生產產品的方法。即沒有策略模式中的第二層封裝,這里用戶需要完成配置產品的動作,雖然使用工廠方法,這個配置動作簡單了一些,但是用戶還是要執行。但是策略模式中,用戶根本就不需要去了解任何配置的事情,也不需要了解算法的存在。
- 策略模式的應用強調:相同行為不同實現的算法封裝。算法和產品的不同在于,算法原本只是為了實現對象的某個行為,由于實現經常變動,因此把這種經常改變的部分提取出來,作為一個抽象類封裝起來。 所以說策略模式屬于對象行為模式。
- 簡單工廠模式的應用強調:相同類別產品的封裝。產品關注的是一個個的對象。所以簡單工廠模式屬于類的創建型模式。
- 這兩種模式都不注重實現,都是在于如何組織、調用產品或算法,所以抽象出一些新的類實現這些管理功能。----設計模式有點參考管理學的東西吧。
?
?
posted on 2015-08-31 16:42 HF_Cherish 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/hf-cherish/p/4759881.html
總結
以上是生活随笔為你收集整理的设计模式(1)--简单工厂模式、策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单模拟实现简单的当登录延时的效果
- 下一篇: 设计模式21:State 状态模式(行为