学习笔录——设计模式
工厂方法
简介
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
代码
// 工厂方法接口
public interface IOperationFactoryMethod
{
Operation CreateOperation();
}
// 加法创建工厂
public class AddOperationFactoryMethod : IOperationFactoryMethod
{
public Operation CreateOperation()
{
return new AddOperation();
}
}
// 加法
public class AddOperation : Operation
{
public override double GetResult()
{
return base.NumA + base.NumB;
}
}
// 客户端
static void Main(string[] args)
{
// 工厂方法
IOperationFactoryMethod method = new AddOperationFactoryMethod();
Operation operation = method.CreateOperation();
operation.NumA = 1;
operation.NumB = 2;
operation.GetResult();
Console.Read();
}
个人理解,不足之处还请指教。
简单工厂优点是客户端该使用哪个运算的实例,简单工厂会根据客户端选择的条件返回不同的实例。但是缺点也在于此,如果是我们把这些代码发布成一个nuget包,以后用户需要自定义一个除法运算方法,扩展起来需要修改工厂类,这样违背了开放封闭原则。而使用工厂方法用户只需自定义一个除法运算类(DivOperation)继承运算类(Operation),内部重写运算逻辑,再创建自定义运算创建除法工厂类(DivOperationFactoryMethod)实现工厂方法接口(IOperationFactoryMethod)返回自定义除法运算类(DivOperation),工厂方法其实就是很好的利用面向对象的继承,多态。
工厂方法创建接口(IOperationFactoryMethod):
// 多态,程序运行期间 决定了method引用指向了AddOperationFactoryMethod
IOperationFactoryMethod method = new AddOperationFactoryMethod();
// 多态 程序运行期间 决定了operation引用指向了method.CreateOperation() 即指向 new AddOperation();
Operation operation = method.CreateOperation();