一:簡單工廠模式
1,概念
簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。顧名思義工廠就是生產(chǎn)東西的,有原料(參數(shù)),模子(對象)就能生產(chǎn)出很多個具有相同功能的對象啦。
2,uml圖
3,代碼示例
- <span style="font-size:18px;"> class Program
- {
- static void Main(string[] args)
- {
- Operate oper; //創(chuàng)建Operate類的oper類
- oper = OperationFactoty.createOperate("+"); //運用簡單工廠判斷實力化的對象
- oper.NumberA = 1; //賦值
- oper.NumberB = 2;
- double result = oper.GetResult();
- Console.WriteLine(result); //顯示運算結(jié)果
- }
- }
-
- //簡單工廠,通過判斷參數(shù),實例化相應(yīng)的對象
- public class OperationFactoty
- {
- public static Operate createOperate(string operate)
- {
- Operate oper = null;
- switch (operate){ }
- return oper;
- }
- }
-
- //定義一個運算基類,包含GetResult虛方法
- public class Operate //定義一個運算類
- {
- private double numberA=0; //運算前的數(shù)
- private double numberB=0; //運算后的數(shù)
- public double NumberA{ }
- public double NumberB{ }
-
- public virtual double GetResult()//返回運算后結(jié)果的方法
- {
- return result; //返回結(jié)果
- }
- }
-
- // 運算類的四個繼承類,分別實現(xiàn)加減乘除四個運算
- public class NumberAdd : Operate //加運算
- {
- public override double GetResult()//實現(xiàn)基類中的虛方法
- {
- double result = NumberA + NumberB;
- return result;
- }
- }
- public class NumberSub:Operate //減運算
- {
- public override double GetResult(){ }
- }
- public class NumberMul:Operate //乘運算
- {
- public override double GetResult(){ }
- }
- public class NumberDiv:Operate //除運算
- {
- public override double GetResult(){ }
- }</span>
4,總結(jié)
簡單工廠模式,我把它理解為一個模子,根據(jù)外界給定的原料,在加上自身封裝好的判斷,生產(chǎn)出不同類型的相應(yīng)的產(chǎn)品、對象。
簡單工廠模式使用場景:工廠類負責(zé)創(chuàng)建的對象比較少;客戶只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心;簡單工廠很容易違反高內(nèi)聚低耦合原則,因此一般只在很簡單的情況下應(yīng)用。
二:工廠方法模式
1,概念
是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,讓子類決定實例化哪一個類,將實際創(chuàng)建工作推遲到子類當(dāng)中。
2,uml圖
3,代碼實例
(1)工廠方法實現(xiàn)
- <span style="font-size:18px;"> class Program
- {
- static void Main(string[] args)
- {
- IFactory factory = new UndergraduateFactory(); //由接口創(chuàng)建新的學(xué)雷鋒大學(xué)生
- LeiFeng student = factory.CreateLeifeng(); //實例化
-
- student.BuyRice();
- student.Sweep();
- student.Wash();
- }
- }
- //雷鋒類,定義了一些功能
- class LeiFeng
- {
- public void Sweep(){ } //擦桌子
- public void Wash(){ } //洗衣服
- public void BuyRice(){ } //買米
- }
-
-
- //學(xué)雷鋒的大學(xué)生
- class UnderGraduate : LeiFeng{ }
- //社區(qū)志愿者
- class Volunteer : LeiFeng{ }
-
- //雷鋒工廠
- interface IFactory //定義一個接口,實現(xiàn)創(chuàng)建雷鋒類的功能
- {
- LeiFeng CreateLeifeng();
- }
-
- class UndergraduateFactory : IFactory//學(xué)雷鋒大學(xué)生工廠
- {
- public LeiFeng CreateLeiFeng()
- {
- return new UnderGraduate();
- }
- }
- class VolunteerFactory : IFactory//社區(qū)志愿者工廠
- {
- public LeiFeng CreateLeiFeng()
- {
- return new Volunteer();
- }
- }</span>
(2)簡單工廠實現(xiàn)
- <span style="font-size:18px;"> class Program
- {
- static void Main(string[] args)
- {
- LeiFeng studentA = SimpleFactory.CreateLeiFeng("學(xué)雷鋒的大學(xué)生");//用簡單工廠創(chuàng)建并實例化學(xué)雷鋒的大學(xué)生
- studentA.BuyRice();
- LeiFeng studentB = SimpleFactory.CreateLeiFeng("社區(qū)志愿者");//用簡單工廠創(chuàng)建實例化社區(qū)志愿者
- studentB.BuyRice();
- }
- }
- //雷鋒類,定義了一些功能
- class LeiFeng
- {
- public void Sweep(){ } //擦桌子
- public void Wash(){ } //洗衣服
- public void BuyRice(){ } //買米
- }
-
-
- //簡單工廠類
- class SimpleFactory
- {
- public static LeiFeng CreateLeiFeng(string type)
- {
- LeiFeng result = null;
- switch (type) //判斷選擇要創(chuàng)建對象的類型
- {
- case "學(xué)雷鋒的大學(xué)生":
- result = new UnderGraduate();
- break;
- case "社區(qū)志愿者":
- result = new UnderGraduate();
- break;
- }
- return result;
- }
-
- }</span>
4,總結(jié)
工廠方法模型中,“工廠”創(chuàng)建的是還沒有分化好的對象,其中沒有邏輯判斷相比于簡單工廠模式,基類工廠去實現(xiàn)接口,子工廠去實現(xiàn)判斷并能生產(chǎn)出相應(yīng)功能的對象。
三:簡單工廠和工廠方法模式的比較
1,簡單工廠模式
專門定義一個工廠類負責(zé)創(chuàng)建其他類的實例,最大的優(yōu)點在于工廠類中包含了必要的邏輯,根據(jù)客戶需要的條件動態(tài)實例化相關(guān)的類
2,工廠方法模式
創(chuàng)建對象的接口,讓子類去決定具體實例化的對象,把簡單的內(nèi)部邏輯判斷移到了客戶端代碼。工廠方法克服了簡單工廠違背開放-封閉原則的缺點,又保持了封裝對象創(chuàng)建過程的優(yōu)點。
|