工廠方法模式(Factory Method):定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。


namespace SimleFactory
{
public class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public virtual double GetResult()
{
double result = 0;
return result;
}
}
public class OperationAdd:Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
public class OperationSub : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
public class OperationMul : Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
}
public class OperationDiv : Operation
{
public override double GetResult()
{
if (NumberB == 0)
throw new Exception("除數不能為0.");
return NumberA / NumberB;
}
}
/// <summary>
/// 簡單工廠
/// </summary>
public class OperationFactory
{
public static Operation CreateOperation(string operate)
{
Operation oper = null;
switch(operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationAdd();
break;
case "*":
oper = new OperationAdd();
break;
case "/":
oper = new OperationAdd();
break;
}
return oper;
}
}
/// <summary>
/// 工廠方法
/// </summary>
public interface IFactory
{
Operation CreateOperation();
}
public class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
public class SubFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
public class MulFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
public class DivFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
}
View Code
測試代碼:

IFactory factory = new AddFactory();
Operation oper= factory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Assert.AreEqual(result, 3);
View Code