設計模式之簡單模式與策略模式

2022-09-23 16:03:11 字數 2736 閱讀 3881

最近在學習簡單工廠模式與策略模式時,發現他們有很多相同之處,他們都是通過多型來實現不同子類的選取,比較難分辨,於是做了一下總結。

簡單工廠模式用於比如演算法之於加減乘除、水果之於蘋果梨香蕉、文具之於筆尺,這些例子的共同特點就是具體、數量有限,不涉及複雜的演算法,簡單工廠模式只是解決了物件的建立問題,工廠類中封裝了所有的選擇過程,如果物件要增加、減少、變化,就要改動工廠,以至於**的重寫量增大,並且在操作過程中,客戶需要指定乙個引數給工廠,工廠按照引數選擇出需要例項化的派生類。在簡單工廠模式中,客戶需要知道抽象基類和工廠類,工廠類用來生成物件,使用抽象基類的介面來完成工作。它的核心是「簡單模式是用來封裝所有物件的」。

下面是乙個簡單工廠模式的例子:

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...