工廠模式專門負責將大量有共同接口的類實例化。工廠模式能夠動態決定將哪個類實例化,沒必要事先知道每次要實例化哪個類。
工廠模式有如下三種形態:web
這一篇文章要總結的是比較經常使用的簡單工廠模式。算法
Simple Factory模式根據提供給它的數據,返回幾個可能類中的一個類的實例。一般它返回的類都有一個公共的父類和公共的方法。ide
簡單工廠模式一般有三個角色。
1,工廠類(指的是簡單工廠類),工廠類在客戶端的直接控制下建立產品(指的是具體的算法類如加法)對象。
2,抽象產品類(指的是運算類),定義簡單工廠建立的對象的父類或它們共同擁有的接口。能夠是一個類,抽象類或接口。
3,具體產品類(如加法類),定義工廠加工出的具體對象。post
//抽象類 public abstract class Operation { private double _numberA = 0d; private double _numberB = 0d; public double NumberA { set { _numberA = value; } get { return _numberA; } } public double NumberB { set { _numberB = value; } get { return _numberB; } } public virtual double GetResult() { double result = 0d; return result; } } //具體類(由簡單工廠類來實例化) public class OperationAdd:Operation { public override double GetResult()//override父類虛方法 { double result = 0d; result = NumberA + NumberB; return result; } } //具體類(由簡單工廠類來實例化) public class OperationSub:Operation { public override double GetResult() { double result = 0d; result = NumberA - NumberB; return result; } } //具體類(由簡單工廠類來實例化) public class OperationMul:Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } //具體類(由簡單工廠類來實例化) public 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; } } //客戶端調用 class Program { static void Main(string[] args) { Operation operation = null; Console.WriteLine("請輸入運算符:"); operation = OperationFactory.CreateOperate(Console.ReadLine());//根據輸入的字符,工廠類來決定實例化具體的產品對象 Console.WriteLine("請輸入第一個數字:"); operation.NumberA = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("請輸入第二個數字:"); operation.NumberB = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("結果爲:"+operation.GetResult()); Console.ReadKey(); } }
優勢:工廠類決定了實例化哪個具體"產品"類,客戶端免去了建立產品對象的責任,而僅僅是"消費"產品,從而實現了對責任的分割,也就是程序的耦合度更低了。
缺點:工廠類集中了全部產品的建立邏輯,一旦工廠類不能工做,整個系統都會受到影響。任何事物都有兩面性,相較於它給咱們帶來的好處,整體來講仍是利大於弊的。this