文章目錄
原理
工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
與簡單工廠模式對比:
1 工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’,實現了可擴展。其次更復雜的層次結構,可以應用於產品結果複雜的場合。
2.工廠方法模式對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不再負責具體的產品生產, 而是隻制定一些規範,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。
代碼
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();
}
}
//////////////////////////簡單工廠中的實現/////////////////////////////
//運算類
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("除數不能爲0.");
}
result = NumberA / NumberB;
return result;
}
}
}
參考
參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.