原理
工廠方法(Factory Method)模式的意義是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當中。核心工廠類不再負責產(chǎn)品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現(xiàn)的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進新的產(chǎn)品。
與簡單工廠模式對比:
1 工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現(xiàn)‘開-閉 原則’,實現(xiàn)了可擴展。其次更復雜的層次結構,可以應用于產(chǎn)品結果復雜的場合。
2.工廠方法模式對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不再負責具體的產(chǎn)品生產(chǎn), 而是只制定一些規(guī)范,具體的生產(chǎn)工作由其子類去完成。在這個模式中,工廠類和產(chǎn)品類往往可以依次對應。即一個抽象工廠對應一個抽象產(chǎn)品,一個具體工廠對應一個具體產(chǎn)品,這個具體的工廠就負責生產(chǎn)對應的產(chǎn)品。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工廠方法模式
{
class Program
{
static void Main(string[] args)
{
IFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result);
Console.ReadKey();
}
}
}
Operation.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工廠方法模式
{
//構建一個工廠
interface IFactory
{
Operation CreateOperation();
}
//加法類工廠
class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
//減法類工廠
class SubFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
//乘法類工廠
class MulFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
//除法類工廠
class DivFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
//////////////////////////簡單工廠中的實現(xiàn)/////////////////////////////
//運算類
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("除數(shù)不能為0.");
}
result = NumberA / NumberB;
return result;
}
}
}