工厂模式】:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
以简单计算器为例:
【简单工厂实现】:
usingSystem;
//【简单工厂类】
classOperationFactory
{
publicstaticOperationCreateOperation(stringoperate)
{
Operationoper=null;//保存Operation类的一个引用。
//让子类决定实例化哪一个类
switch(operate)
{
case"+":
oper=newOperationAdd();
break;
case"-":
oper=newOperationSub();
break;
case"*":
oper=newOperationMul();
break;
case"/":
oper=newOperationDiv();
break;
}
returnoper;
}
}
//【运算类】
abstractclassOperation
{
publicintNumberA;
publicintNumberB;
publicabstractvoidGetResult();
}
classOperationAdd:Operation
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算加法时结果为:"+(NumberA+NumberB));
}
}
classOperationSub:Operation
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算减法时结果为:"+(NumberA-NumberB));
}
}
classOperationMul:Operation
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算乘法时结果为:"+(NumberA*NumberB));
}
}
classOperationDiv:Operation
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算除法时结果为:"+(NumberA/NumberB));
}
}
//【客户端代码】
classApp
{
staticvoidMain()
{
Operationoper;
oper=OperationFactory.CreateOperation("+");
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
【工厂模式】:
usingSystem;
//【运算类】
abstractclassOperation//运算基类;
{
publicintNumberA;
publicintNumberB;
publicabstractvoidGetResult();
}
classOperationAdd:Operation//加法;
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算加法时结果为:"+(NumberA+NumberB));
}
}
classOperationSub:Operation//减法;
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算减法时结果为:"+(NumberA-NumberB));
}
}
classOperationMul:Operation//乘法;
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算乘法时结果为:"+(NumberA*NumberB));
}
}
classOperationDiv:Operation//除法;
{
publicoverridevoidGetResult()
{
Console.WriteLine("计算除法时结果为:"+(NumberA/NumberB));
}
}
//【Factory接口】
interfaceIFactory
{
OperationCreateOperaion();
}
//【工厂类】
classAddFactory:IFactory//加法工厂类
{
publicOperationCreateOperaion()
{
returnnewOperationAdd();
}
}
classSubFactory:IFactory//减法工厂类
{
publicOperationCreateOperaion()
{
returnnewOperationSub();
}
}
classMulFactory:IFactory//乘法工厂类
{
publicOperationCreateOperaion()
{
returnnewOperationMul();
}
}
classDivFactory:IFactory//除法工厂类
{
publicOperationCreateOperaion()
{
returnnewOperationDiv();
}
}
//【客户端代码】
classApp
{
staticvoidMain()
{
//真正体现对接口编程
IFactoryoperFactory=newAddFactory();//实例化一个加法工厂;
Operationoper=operFactory.CreateOperaion();
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
简单工厂模式的最大优点在于:工厂类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,现在只改客户端了。
工厂方法模式克服了简单工厂模式违背开放-封闭原则,又保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。