最近在學習簡單工廠模式與策略模式時,發現他們有很多相同之處,他們都是通過多型來實現不同子類的選取,比較難分辨,於是做了一下總結。
簡單工廠模式用於比如演算法之於加減乘除、水果之於蘋果梨香蕉、文具之於筆尺,這些例子的共同特點就是具體、數量有限,不涉及複雜的演算法,簡單工廠模式只是解決了物件的建立問題,工廠類中封裝了所有的選擇過程,如果物件要增加、減少、變化,就要改動工廠,以至於**的重寫量增大,並且在操作過程中,客戶需要指定乙個引數給工廠,工廠按照引數選擇出需要例項化的派生類。在簡單工廠模式中,客戶需要知道抽象基類和工廠類,工廠類用來生成物件,使用抽象基類的介面來完成工作。它的核心是「簡單模式是用來封裝所有物件的」。
下面是乙個簡單工廠模式的例子:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 簡單工廠模式
public class operation//抽象類
set
}public double numberb
set
}public virtual double getresult()
}class operationadd : operation//基類:加法
}class operationsub : operation//減法
}class operationmul : operation//乘法
}class operationdiv : operation//除法
}//工廠類
public class operationfactory
return oper;}}
}}由於產品物件形式經常改變,使用簡單工廠模式則會導致**重新編寫,而策略模式則避免了這一點,它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,演算法的變化不會影響到客戶對演算法的使用,適用於大量複雜運算,它和簡單工廠模式的區別就是,它沒有工廠類,而是將工廠類的**寫到了客戶端,客戶端包括具有各種功能的**,策略模式在使用時首先要建立乙個類,將該類的物件傳遞進去,通過該物件呼叫不同的演算法,下面的context就是這個作用,它將使用選擇物件的工廠交給了使用該模式的使用者.它的核心是:策略模式是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規則,只要在分析過程中遇到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性.
下面是一段策略模式的例子:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace ce
private void form1_load(object sender, eventargs e)
private void btnok_click(object sender, eventargs e)
//現金收取抽象類
abstract class cashsuper
//正常收費子類
class cashnormal:cashsuper
}//打折收費子類
class cashrebate:cashsuper
public override double acceptcash(double money)
}//返利收費子類
class cashreturn:cashsuper
public override double acceptcash(double money)
}//現金收費工廠類
class cashfactory
return cs ;}}
class cashcontext
public double getresult(double money)
}//客戶端窗體程式
double total=0.0d;
private void bntok_click(object sender, eventargs e)
cashsuper csuper = cashfactory.createcashaccept(cbxtype.selecteditem.tostring());
double totalprices=0d;
//通過多型,可以得到收費的結果
totalprices =csuper .acceptcash (convert .todouble(txtprice .text)*convert.todouble (txtnum.text ) );
total=total+totalprices;
lbxlist .items.add("單價:"+txtprice.text +"數量:"+txtnum.text +" "+cbxtype.selecteditem +"合計:" +totalprices .tostring ());
lblresult.text =total .tostring ();}}
}大家通過這兩段**和我的描述應該對這兩種模式有所了解了,理解的還不夠深刻,希望大家多多指出!
簡單通俗設計模式之策略模式
策略模式的定義很簡單,那就是根據傳入的引數型別而執行不同的行為的方法。方法包含演算法中不變的部分,策略包含變化的部分,實際上策略就是傳入的引數物件。具體看下例子 定義乙個策略介面 public inte ce processor 實現乙個字串分割的策略 public class splitstrin...
設計模式之簡單工廠模式,工廠模式,策略模式
簡單工廠模式 的最大優點是在工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態例項化相關類,去得到客戶想要的產品。但個人覺得簡單工廠模式的最大優點正是產生它最大缺點之處。因為它的工廠類違反了開放 封閉原則 類,模組,方法等對於擴充套件是開放的,對於更改是封閉的。每當新增乙個功能,我們就需要去修改它的...
設計模式之策略模式與模板模式
策略模式比較類似於乙個計算有多種計算過程來獲得結果,我們把每種計算方式封裝為乙個策略,把策略作為可選擇引數來決定使用什麼計算方式。定義策略介面,表示dofight計算過程。public inte ce fightstrategy 定義實現策略類,表示各個不同的計算過程。public class xi...