引言:java
從接觸編碼到如今有一段時間了,老是在爲一些基礎語法、技能而不斷學習,學着學着感受有些茫然。在上一篇曾經說過一大牛的教誨:「c語言、java語言、C#語言這些都是一些基本的工具,而它們其中的語法、技能都是一些很簡單的基礎知識,剛接觸編碼時確定會有不少的知識、技能你不懂,但你只要碰到而且學習確定可以熟練使用。因此語言、技能都不重要,重要的是脫離語言工具的思想,編程的思想。設計模式是思想的體現,多多學習確定沒錯」。這以後一直在看設計模式方面的書,但「紙上得來終覺淺,絕知此事要躬行」,因而想把看的書、評論、博客等一些東西總結到一塊摘寫出來,加深印象同時方便學習。如今開始第一篇:簡單工廠模式。編程
定義:設計模式
定義一個類專門負責建立其餘類的實例,具體建立什麼實例由傳入的參數而決定,而且這些類都共同繼承於一個父類或者有共同的接口。簡單工廠模式是工廠模式家族中最簡單的一種實用模式,也能夠說是不一樣工廠模式的一個特殊實現。架構
簡單工廠符合面向對象重要原則之一:封裝改變。框架
參與者:ide
工廠角色Creator:模式的核心,負責建立全部實例,根據傳入的參數,決定建立什麼類型的實例。工具
抽象產品角色Product:上述全部類的父類或者是接口。學習
具體產品角色Concrete Product:由工廠類建立出來的具體的產品實例。this
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(); }
到此,一個簡單的計數器實例編寫完畢。客戶端向工廠類傳入參數「-」,工廠類根據傳入的參數建立具體的產品實例,而後進行運算。
簡單工廠模式優勢:
簡單工廠模式解決了客戶端直接依賴於具體對象的問題,客戶端能夠消除直接建立對象的責任,而僅僅是消費產品。 低耦合,與外界具體產品類分開。
實現代碼複用。
缺點:
違反了高內聚的原則,直接致使:若是須要建立新的類,也就必須改變工廠類。
適用場合:
適用於建立的對象比較少的狀況;
適用於客戶端只負責傳入參數而不關心建立實例的內部邏輯。
補充:
看的設計模式第一個就是簡單工廠模式,可是實際項目中一直沒有用,前幾天一個同事爲了解決項目問題用了簡單工廠模式,過後跟他一討論才知道,那哥們比較牛,沒有看過設計模式,就是根據本身的想象寫出一個小架構,符合簡單工廠模式。此處只是爲了加速對簡單工廠模式的理解,大體講解該項目的系統框架。
該項目是:爲了集合多廠商產品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便可。經過此項目,從理論方面學習設計模式進入到實際的項目實踐中去,雖然是看到別人寫的,但最本身也是一個不小的收穫。