簡單工廠模式學習總結(C#)
本人是一枚女程式“媛”,本科計算機出身,研究生轉的軟體,程式碼量屈指可數。哈哈。。。最近在看一本設計模式的書,裡面的內容感覺講的挺不錯的,也就在這裡隨手寫一些筆記,大家可以共勉,有什麼不對的或者需要改進的地方歡迎各位批評指正。。。
以前本科寫程式碼只注重執行結果,只要能夠執行出來得到預期的效果就可以了。可是現在覺得能夠寫出來高質量的程式碼更加重要。高質量的程式碼可以從四個方面來衡量:①可維護性。②可複用性。③可擴充套件性。④靈活性好。
①可維護性:指當用戶需求改變時,只需更改少量程式碼便可達到最終結果,且對其他模組程式碼影響低。
②可複用性:指相同的程式碼塊可以運用在不同的程式中。比如:有一個運算類,裡面具體有實現加減乘除運算的方法。這個運算類可以在任何需要計算的時候被拿來使用,只需宣告該類並例項化物件再呼叫具體的方法即可。
③可擴充套件性:指需要增加一些功能需求時,只需更改少量程式碼便可達到最終結果,且對其他模組程式碼影響低。
④靈活性好。
面向物件的程式設計思想就是:通過封裝、繼承、多型把程式的耦合度降低,使用設計模式使得程式更加靈活、容易修改並且易於複用。
下面分享一下“簡單工廠模式”的思想和一個小栗子。
比如要實現一個計算器,假設目前只有加減乘除運算。首先,需要定義一個運算類(可以定義為抽象類),加減乘除運算四個子類都繼承於運算類,子類中有自己運算需要的演算法程式碼。按照之前來說,如果需要實現兩個數的加法運算,就要例項化一個加法類的物件再進行運算;如果需要實現兩個數的減法運算,就要例項化一個減法類的物件再進行運算,乘法除法同理,我們有幾種運算就需要知道這些相關類的名稱都是什麼。如果你是使用者,會用這樣的計算器嗎?每次進行運算時需要先在大腦中回憶一下這個運算對應的類名是什麼。我想都不會願意的吧。所以需要有一個類來幫我們完成這項工作,這就是“工廠類”的工作。工廠就是用一個單獨的類來做創造例項的過程。如下程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Factory_Model { //運算類 public class Operation { private double a; private double b; public double A { get => a; set => a = value; } public double B { get => b; set => b = value; } public virtual double Result() { double result = 0; return result; } } //加法類 class AddOperator : Operation { public override double Result() { double result = 0; result = A + B; return result; } } //減法類 class SubOperator : Operation { public override double Result() { double result = 0; result = A - B; return result; } } //乘法類 class MulOperator : Operation { public override double Result() { double result = 0; result = A * B; return result; } } //除法類 class DivOperator : Operation { public override double Result() { double result = 0; if ( B == 0) { throw new Exception("除數不能為0"); } result = A / B; return result; } } //工廠類 public class Factory_Operator { public static Operation CreateOperator(string operate) { Operation oper = null; switch (operate) { case "+": oper = new AddOperator(); break; case "-": oper = new SubOperator(); break; case "*": oper = new MulOperator(); break; case "/": oper = new DivOperator(); break; default: Console.WriteLine("輸入運算子有誤!!!"); break; } return oper; } } //測試類 class Program { static void Main(string[] args) { //工廠模式 Operation operation = null; operation = Factory_Operator.CreateOperator("+"); operation.A = 4; operation.B = 8; double result = operation.Result(); Console.WriteLine(result); } } }
上述程式碼中只需要輸入相關的運算子,工廠類就會幫我們去例項化一個相應的物件,通過運算子的不同就能例項化不同類的物件。客戶再需給運算的數賦值,呼叫類中的運算方法就可以得到最終的運算結果。
相比於之前我們的程式碼對於客戶來說也更加友好了,再也不需要去記一些運算的類名。這些類名對於客戶來說都是不可知的,因此也就降低了客戶和後臺邏輯程式碼的耦合性。(後臺和客戶端是C#WinForm中的俗語,自己不想畫框框和按鈕就把這些在控制檯實現一遍,這裡的測試類就相當於是客戶端啦。。。)