c#工厂方法模式
1、定义
定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。
2、实现原理
2.1. 介绍工厂方法模式首先得提一提简单工厂方法:
简单工厂模式最大的优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
缺点:简单工厂如果要添加新的功能,则一定要修改工厂类中的’CASE’分支条件,就是说不仅对扩展开放了,也对修改开放了,违背了“开放——封闭原则”
2.2. 分析:
既然工厂类和分支耦合,那么就对他下手,根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的方法。然后,所有要生产具体类的工厂,就去实现这个接口,这样一个简单工厂模式的工厂类,就变成一个工厂抽象接口和多个具体生成对象的工厂,于是我们要增加新的功能时 就不用修改原有的工厂类了,只要增加此功能的运算类和相应的工厂类就可以了,工厂方法模式实现时,由客户端决定实例化那个工厂来实现运算类
2.3 UML类图
3、实例
还是以简单工厂方法的例子说明,采用工厂方法模式实现
3.1 UML类图:
3.2 代码实现
//创建工厂接口
interface IFactory
{
Operation CreateOperation();
}
//加法工厂
class FactoryAdd : IFactory
{
public Operation CreateOperation()
{
return new OperationADD();
}
}
//减法工厂
class FactorySub : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
//运算的父类
public 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;
}
}
//具体的操作类(加)
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 Program
{
static void Main(string[] args)
{
//实例加法工厂
IFactory factory = new FactoryAdd();
Operation operationadd = factory.CreateOperation();
operationadd.NumberA = 2;
operationadd.NumberB = 3;
double result = operationadd.GetResult();
Console.WriteLine(result.ToString());
Console.ReadKey();
}
}
输出结果:5
4、优点
克服了简单工厂违背开放——封闭原则的缺点,又保持了封装对象创建过程的优点