简单工厂和工厂模式

工厂模式】:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

适用性
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

以简单计算器为例:

【简单工厂实现】:

简单工厂和工厂模式_第1张图片

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();

}

}

工厂模式实现简单工厂和工厂模式_第2张图片

【工厂模式】:

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();

}

}

简单工厂模式的最大优点在于:工厂类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,现在只改客户端了。

工厂方法模式克服了简单工厂模式违背开放-封闭原则,又保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。

<!--EndFragment-->
<!--EndFragment-->

你可能感兴趣的:(工厂模式)