大話設計模式筆記——簡單工廠模式
本篇內容為博主個人在學習《大話設計模式》(程傑 著)過程中的測試隨筆,在此給各位程式設計新手作為學習參考,畢竟網上深入學習的資料對於瓶頸期的新人大多不太友好,我會盡量詳細的展示並解釋每一個細節,也歡迎大家對我的不足給予批評指正。
本篇作者以簡易計算器程式作為案例,向我們展示瞭如何通過簡單工廠模式來處理低耦合程式碼的靈活例項化相應業務類的例項,讓我們領略真正面向物件程式設計的思維。
專案目錄如下
1、運算業務類基類
運算業務類基類(BaseOperation)定義了兩個運算值(NumberA和NumberB)和一個獲取結果的虛方法(GetResult())。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EasyFactoryTest.Business { //運算業務類基類 class BaseOperation { private double _NumberA = 0; private double _NumberB = 0; public double NumberA { get { return _NumberA; } set { _NumberA = value; } } public double NumberB { get { return _NumberB; } set { _NumberB = value; } } /// <summary> /// virtual修飾符表示該方法為虛方法,可以被子類重寫 /// 此處用於給各具體計算業務子類(加減乘除等)重寫計算過程 /// </summary> /// <returns></returns> public virtual double GetResult() { double Result = 0; return Result; } } }
2、加法運算業務類
繼承運算業務類基類(BaseOperation),重寫基類方法GetResult(),實現對兩個運算值(NumberA和NumberB)的加法運算。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EasyFactoryTest.Business { /// <summary> /// 加法運運算元類,繼承BaseOperation運算業務基類 /// </summary> class OperationAdd : BaseOperation { /// <summary> /// 重寫基類運算方法 override修飾符表示重寫基類方法 /// </summary> /// <returns></returns> public override double GetResult() { double Result = 0; Result = NumberA + NumberB; return Result; } } }
3、減法運算業務類
繼承運算業務類基類(BaseOperation),重寫基類方法GetResult(),實現對兩個運算值(NumberA和NumberB)的減法運算。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EasyFactoryTest.Business { /// <summary> /// 減法運運算元類,繼承BaseOperation運算業務基類 /// </summary> class OperationSub : BaseOperation { /// <summary> /// 重寫基類運算方法 override修飾符表示重寫基類方法 /// </summary> /// <returns></returns> public override double GetResult() { double Result = 0; Result = NumberA - NumberB; return Result; } } }
4、乘法運算業務類
繼承運算業務類基類(BaseOperation),重寫基類方法GetResult(),實現對兩個運算值(NumberA和NumberB)的乘法運算。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EasyFactoryTest.Business
{
/// <summary>
/// 乘法運運算元類,繼承BaseOperation運算業務基類
/// </summary>
class OperationMul : BaseOperation
{
/// <summary>
/// 重寫基類運算方法 override修飾符表示重寫基類方法
/// </summary>
/// <returns></returns>
public override double GetResult()
{
double Result = 0;
Result = NumberA * NumberB;
return Result;
}
}
}
5、除法運算業務類
繼承運算業務類基類(BaseOperation),重寫基類方法GetResult(),實現對兩個運算值(NumberA和NumberB)的除法運算。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EasyFactoryTest.Business
{
/// <summary>
/// 除法運運算元類,繼承BaseOperation運算業務基類
/// </summary>
class OperationDiv : BaseOperation
{
/// <summary>
/// 重寫基類運算方法 override修飾符表示重寫基類方法
/// </summary>
/// <returns></returns>
public override double GetResult()
{
double Result = 0;
Result = NumberA / NumberB;
return Result;
}
}
}
6、運算工廠類
工廠類定義了一個例項化運算業務類的方法,通過傳入的運算子字串,返回相應運算業務類的例項化物件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EasyFactoryTest.Business
{
class OperationFactory
{
/// <summary>
/// 根據運算子例項化相應的運算業務例項
/// </summary>
/// <param name="oOperator"></param>
/// <returns></returns>
public static BaseOperation InstantiationOperation(string oOperator)
{
BaseOperation oOperationInstantiation = null;
switch (oOperator)
{
case "+":
oOperationInstantiation = new OperationAdd();
break;
case "-":
oOperationInstantiation = new OperationSub();
break;
case "*":
oOperationInstantiation = new OperationMul();
break;
case "/":
oOperationInstantiation = new OperationDiv();
break;
}
return oOperationInstantiation;
}
}
}
7、WinFrom後臺程式碼
WinFrom介面如下
Winfrom後臺程式碼
using EasyFactoryTest.Business;
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 EasyFactoryTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btn_count_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txt_NumberA.Text.Trim()) || string.IsNullOrEmpty(txt_NumberB.Text.Trim()))
{
MessageBox.Show("請輸入計算值!");
return;
}
if (cbx_Operate.SelectedItem == null)
{
MessageBox.Show("請選擇運算!");
return;
}
//通過工廠類獲取對應運算業務例項
BaseOperation oOperationInstantiation = OperationFactory.InstantiationOperation(cbx_Operate.SelectedItem.ToString());
//給輸入賦值
oOperationInstantiation.NumberA = double.Parse(txt_NumberA.Text.Trim());
oOperationInstantiation.NumberB = double.Parse(txt_NumberB.Text.Trim());
//輸出結果
txt_Result.Text = oOperationInstantiation.GetResult().ToString();
}
}
}
以上便是整個簡單工廠模式案例程式碼,學習設計模式是面向物件程式設計的必由之路,可惜自己並沒有早一點醒悟,於是在工作兩年多的今天,我依然只是在公司開發框架套路下複製貼上的小菜雞,作為一個靠軟體開發吃飯的人來說,最恐怖的莫過於原地踏步,安於現狀。當我產生想要自己寫點小專案的想法時,竟發現自己離開了公司框架連基本的運用常用ORM框架操作資料庫都舉步維艱,於是痛下決心踏實學習,希望能夠彌補缺失的那些基礎知識。也希望後繼的小猿們能夠腳踏實地、踏實學習,對於程式設計方面的基礎知識務必自己親自通過程式碼一一體會一遍。