设计模式整理之简单工厂
具體實現代碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 設計模式實例 {class Program{/// <summary>/// 考慮一個簡單的軟件應用場景,一個軟件系統可以提供多個外觀不同的按鈕/// (如圓形按鈕、矩形按鈕、菱形按鈕等), 這些按鈕都源自同一個基類,/// 不過在繼承基類后不同的子類修改了部分屬性從而使得它們可以呈現不同的外觀,/// 如果我們希望在使用這些按鈕時,不需要知道這些具體按鈕類的名字,/// 只需要知道表示該按鈕類的一個參數,并提供一個調用方便的方法,/// 把該參數傳入方法即可返回一個相應的按鈕對象,此時,就可以使用簡單工廠模式。/// /// </summary>/// <param name="args"></param>static void Main(string[] args){Operation oper;Console.Write("請輸入第一個數: ");string strNum1 = Console.ReadLine();Console.Write("請輸入操作符(+ - * /): ");string strOperate = Console.ReadLine();oper = OperationFactory.CreateOperate(strOperate);Console.Write("請輸入第二個數: ");string strNum2 = Console.ReadLine();oper.Num1 = Convert.ToDouble(strNum1);oper.Num2 = Convert.ToDouble(strNum2);string Result = "";Result = Convert.ToString(oper.GetResult());Console.WriteLine("結果是:" + Result);Console.ReadKey(true);}}/// <summary>/// 就此問題個人理解:/// 1、實現方法:子類繼承并重寫父類方法,父類只接受處理的事務,而不是自己執行,而是交給/// 子類對象去實現,各個對象具有父類共同屬性,而執行不同操作/// 2、具體實現:/// 工廠:工廠角色負責實現創建所有實例的內部邏輯/// 抽象產品角色:抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口/// 具體產品角色:具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例/// </summary>/** 說通俗點有點像面向對象編程中的多態性,一個基類,有多個派生類,* 在另外的調用程序中,根據參數來決定返回這個基類的哪個具體的派生類,* 返回值為基類類型,因為基類的引用可以指向派生類對象,* 而且這些所有的派生類都包含有基類的函數,也就是說派生類中有相同的函數* 但是函數的實現可能不同。*/public class OperationFactory{public static Operation CreateOperate(string operate){Operation oper = null;switch (operate){case "+":oper = new OperationAdd();break;case "-":oper = new OperationSub();break;case "*":oper = new OperationMul();break;case "/":oper = new OperationDiv();break;}return oper;}}public class OperationDiv : Operation{public override double GetResult(){try{double result = 0;// if (Num2 == 0)// throw new Exception("除數不為0");result = Num1 / Num2;return result;}catch (Exception e){Console.WriteLine(e);throw;}}}public class OperationMul : Operation{public override double GetResult(){double result = 0;result = Num2 * Num1;return result;}}public class OperationSub : Operation{public override double GetResult(){double result = 0;result = Num1 – Num2;return result;}}public class OperationAdd : Operation{public override double GetResult(){double result = 0;result = Num2 + Num1;return result;}}public class Operation{public double Num1 { get; set; }public double Num2 { get; set; }public virtual double GetResult(){double result = 0;return result;}}}模式分析
?將對象的創建和對象本身業務處理分離可以降低系統的耦合度,使得兩者修改起來都相對容易。
?在調用工廠類的工廠方法時,由于工廠方法是靜態方法,使用起來很方便,可通過類名直接調用,而且只需要傳入一個簡單的參數即可,在實際開發中,還可以在調用時將所傳入的參數保存在XML等格式的配置文件中,修改參數時無須修改任何源代碼。
?簡單工廠模式最大的問題在于工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。
?簡單工廠模式的要點在于:當你需要什么,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
簡單工廠模式的優點
?工廠類含有必要的判斷邏輯,可以決定在什么時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用于創建對象。
?客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對于一些復雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
?通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
簡單工廠模式的缺點
?由于工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。
?使用簡單工廠模式將會增加系統中類的個數,在一定程序上增加了系統的復雜度和理解難度。
?系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過于復雜,不利于系統的擴展和維護。
?簡單工廠模式由于使用了靜態工廠方法,造成工廠角色無法形成基于繼承的等級結構。
適用環境
在以下情況下可以使用簡單工廠模式:
?工廠類負責創建的對象比較少:由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。
?客戶端只知道傳入工廠類的參數,對于如何創建對象不關心:客戶端既不需要關心創建細節,甚至連類名都不需要記住,只需要知道類型所對應的參數。
以上收藏自https://design-patterns.readthedocs.io/zh_CN/latest/index.html,有問題,不吝賜教!
轉載于:https://www.cnblogs.com/fenqinearl/p/10704710.html
總結
以上是生活随笔為你收集整理的设计模式整理之简单工厂的全部內容,希望文章能夠幫你解決所遇到的問題。