1.概述
在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。这个借口所指的是一个抽象方法,该方法说明需要创建一个对象,但并不给出具体的的创建方法和创建什么类型的对象。
工厂方法的使用场合:当一个类不知道他所必须创建对象的类或一个类希望由子类来指定他所创建的对象时,可以使用工厂方法。
工厂方法模式结构图:
图中表示表示工厂方法的部分只是FactoryMethod()。在Creator中定义这个方法的接口,在ConcreteProduct中实现这个方法。如果没有这个方法就没有工厂方法模式。Creator的职责并非只是创建一个产品,他经常同是包含有模板方法,及模式仅限于方法部分,这也就是为什么叫做“工厂方法”的原因。
工厂方法使类中的代码不依赖于他必须创建的类,代码只要知道他需要创建类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。
2.实例
1)大话设计模式中的计算器工厂方法模式实现
计算器的工厂方法模式实现结构图如下图:
代码:
Operation基类:
三个子类:
Operation基类:
Code
public abstract class Operation
{
private double _numbleA = 0;
private double _numbleB = 0;
public double NumbleA
{
get { return _numbleA; }
set { _numbleA = value; }
}
public double NumbleB
{
get { return _numbleB; }
set { _numbleB = value; }
}
public virtual double GetResult()
{
double Result = 0;
return Result;
}
}
public abstract class Operation
{
private double _numbleA = 0;
private double _numbleB = 0;
public double NumbleA
{
get { return _numbleA; }
set { _numbleA = value; }
}
public double NumbleB
{
get { return _numbleB; }
set { _numbleB = value; }
}
public virtual double GetResult()
{
double Result = 0;
return Result;
}
}
三个子类:
Code
public class OperationAdd : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
public class OperationAdd : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
Code
public class OperationMul : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
public class OperationMul : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
Code
public class OprationSub : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
public class OprationSub : Operation
{
public override double GetResult()
{
double Result = 0;
Result = NumbleA + NumbleB;
return Result;
}
}
抽象工厂方法:
Code
public abstract class OperationFactory
{
public abstract Operation CreateOpreation();
}
三个具体工厂方法:
public abstract class OperationFactory
{
public abstract Operation CreateOpreation();
}
Code
public class AddFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationAdd();
}
}
public class AddFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationAdd();
}
}
Code
public class MulFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationMul();
}
}
public class MulFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OperationMul();
}
}
Code
public class SubFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OprationSub();
}
}
public class SubFactory : OperationFactory
{
public override Operation CreateOpreation()
{
return new OprationSub();
}
}
客户端的实现:
Code
static void Main(string[] args)
{
OperationFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOpreation();
oper.NumbleA = 5;
oper.NumbleB = 4;
double result = oper.GetResult();
Console.WriteLine("结果:{0}",result);
Console.ReadLine();
}
3.总结
static void Main(string[] args)
{
OperationFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOpreation();
oper.NumbleA = 5;
oper.NumbleB = 4;
double result = oper.GetResult();
Console.WriteLine("结果:{0}",result);
Console.ReadLine();
}
工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。工厂方法模式退化后可以演变成简单工厂模式。
适用于工厂方法模式: 当一个类不知道它所必须创建的对象的类的时候; 当一个类希望由它的子类来指定它所创建的对象的时候; 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了分装对象创建过程的优点,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了他的缺点。缺点就是由于每增加一个产品,就需要加一个产品工厂类。