工廠方法模式``
代碼塊
運算類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class Operation
{
public double Number1;
public double Number2;
public virtual double GetResult()
{
return 0;
}
}
}
加法類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class AddOperation : Operation
{
public override double GetResult()
{
return Number1 + Number2;
}
}
}
減法類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class SubOperatoin: Operation
{
public override double GetResult()
{
return Number1 - Number2;
}
}
}
乘法類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class MulOperation: Operation
{
public override double GetResult()
{
return Number1 * Number2;
}
}
}
除法類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class DivOperation: Operation
{
public override double GetResult()
{
return Number1 / Number2;
}
}
}
抽象工廠運算類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
interface IOperation
{
Operation CreatOperation();
}
}
加法工廠
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class AddFactory : IOperation
{
public Operation CreatOperation()
{
AddOperation oper = new AddOperation();
return oper;
}
}
}
減法工廠
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class SubFactory : IOperation
{
public Operation CreatOperation()
{
Operation oper = new SubOperatoin();
return oper;
}
}
}
乘法工廠
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class MulFactory : IOperation
{
public Operation CreatOperation()
{
Operation oper = new MulOperation();
return oper;
}
}
}
除法工廠
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class DivFactory : IOperation
{
public Operation CreatOperation()
{
Operation oper = new DivOperation();
return oper;
}
}
}
客戶端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryModel
{
class Programs
{
static void Main(string[] args)
{
IOperation ioperation = new AddFactory();
Operation oper = ioperation.CreatOperation();
oper.Number1 = 1;
oper.Number2 = 2;
oper.GetResult();
Console.WriteLine(oper.GetResult().ToString());
Console.ReadKey();
}
}
}
**
工廠模式和工廠方法模式區別
簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態實例化相關的類,對於客戶端來說,去除了產品依賴。但是問題所在 如果要加一個新的算法或者方法的功能,在前文的工廠模式裏面我們是一定需要給運算工廠類的方法增加Case分支條件,這裏也就是修改原有的類。這等於說我們不但對擴展(對於一個軟件來說擴展了新的功能)開放了 也對修改開放了,違背了開放封閉原則。
工廠方法模式來了--定義一個用於創建對象的接口,讓自雷決定實例化哪一個類。工廠方法模式是一個類的實例化延遲到其子類。這時我們要增加一個新的方法 只需要增加一個運算類和其相應的工廠類就可以了,“”讓整個工廠和產品體系其實都沒有修改的變化,而只是擴展的變化 並且符合了開放--封閉原則的精神“
## 缺點
每增加一個產品就需要加一個產品工廠的類,增加了額外的開發量
工廠方法模式實現時,客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法吧簡單工廠的內部邏輯判斷移到了客戶端進行,如果想要增加功能,原本是需要修改工廠類的,現在則是修改客戶端。
**