引言:
從接觸編碼到現在有一段時間了,總是在為一些基礎語法、技能而不斷學習,學著學著感覺有些茫然。在上一篇曾經說過一大牛的教誨:“c語言、java語言、C#語言這些都是一些基本的工具,而它們其中的語法、技能都是一些很簡單的基礎知識,剛接觸編碼時肯定會有很多的知識、技能你不懂,但你只要碰到并且學習肯定能夠熟練使用。所以語言、技能都不重要,重要的是脫離語言工具的思想,編程的思想。設計模式是思想的體現,多多學習肯定沒錯”。這之后一直在看設計模式方面的書,但“紙上得來終覺淺,絕知此事要躬行”,于是想把看的書、評論、博客等一些東西總結到一塊摘寫出來,加深印象同時方便學習。現在開始第一篇:簡單工廠模式。
定義:
定義一個類專門負責創建其他類的實例,具體創建什么實例由傳入的參數而決定,并且這些類都共同繼承于一個父類或者有共同的接口。簡單工廠模式是工廠模式家族中最簡單的一種實用模式,也可以說是不同工廠模式的一個特殊實現。
簡單工廠符合面向對象重要原則之一:封裝改變。
參與者:
工廠角色Creator:模式的核心,負責創建所有實例,根據傳入的參數,決定創建什么類型的實例。
抽象產品角色PRoduct:上述所有類的父類或者是接口。
具體產品角色Concrete Product:由工廠類創建出來的具體的產品實例。
UML圖:
舉例說明:
列舉大話設計模式中的一個計數器例子,制作一個計數器,進行加減乘除運算。
抽象產品角色:父類(運算類)
public class Operation { 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; } } public virtual double GetResult() { double result = 0; return result; } }
具體產品角色:子類(加減乘除)
class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) { throw new Exception("除數不能為0"); } result = NumberA / NumberB; return result; } }
工廠角色:建造各種實例
public class OperationFactory { public static Operation CreateOperate(string operate) { Operation operation = null; switch (operate) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; } return operation; } }
客戶端調用:
static void Main(string[] args) { Operation operation; operation = OperationFactory.CreateOperate("-"); operation.NumberA = 3; operation.NumberB = 7; double result = operation.GetResult(); Console.WriteLine(result); Console.ReadLine(); }
到此,一個簡單的計數器實例編寫完畢??蛻舳讼蚬S類傳入參數“-”,工廠類根據傳入的參數創建具體的產品實例,然后進行運算。
簡單工廠模式優點:
簡單工廠模式解決了客戶端直接依賴于具體對象的問題,客戶端可以消除直接創建對象的責任,而僅僅是消費產品?! 〉婉詈希c外界具體產品類分開。
實現代碼復用。
缺點:
違反了高內聚的原則,直接導致:如果需要創建新的類,也就必須改變工廠類。
適用場合:
適用于創建的對象比較少的情況;
適用于客戶端只負責傳入參數而不關心創建實例的內部邏輯。
補充:
看的設計模式第一個就是簡單工廠模式,但是實際項目中一直沒有用,前幾天一個同事為了解決項目問題用了簡單工廠模式,事后跟他一討論才知道,那哥們比較牛,沒有看過設計模式,就是根據自己的想象寫出一個小架構,符合簡單工廠模式。此處只是為了加速對簡單工廠模式的理解,大致講解該項目的系統框架。
該項目是:為了集合多廠商產品SDK而開發出來的一套產品,目前僅有A和B廠商的SDK。編寫簡單框架,滿足擴展要求,實現產品功能。
首先編寫一個接口類:
interface IMethod{ void method1(); void method2(); }
其次是A和B廠商都繼承IMethod接口:
class A:IMethod{ void method1() { //user ASDK } void method2() { //user ASDK } }class B:IMethod{ void method1() { //user BSDK } void method2() { //user BSDK } }
工廠類,即決定調用什么方法:
class Factory{ public char factorySDK; public Factory(char factorySDK) { this.factorySDK = factorySDK; } public IMethod CreateSDK(char factorySDK) { IMethod method = null; switch(factorySDK) { case ASDK: method = new A(); break; case BSDK: method = new B(); break; default: break; } return method; }
public void Method1()
{
method.Method1();
}
public void Method2()
{
method.Method2();
}
}
如果下次需要把C廠商產品的SDK也集中進去,如果沒有新的需求,那么便不需要增加新的方法,只需要建造一個C類,繼承IMethod接口。同時在工廠類中新增一個new C即可。通過此項目,從理論方面學習設計模式進入到實際的項目實踐中去,雖然是看到別人寫的,但最自己也是一個不小的收獲。
新聞熱點
疑難解答