您的位置:首页 > 其它

Design Pattern: 简单工厂模式 v.s. 工厂方法模式

2016-09-27 02:10 274 查看
凡是工厂模式,无论是简单的工厂模式还是工厂方法模式,其目的都是封装创建对象的过程,降低客户端代码和产品对象的耦合。使得更换对象的时候,客户端的代码不需要大改。

简单工厂模式通过定义一个简单工厂类(就是一个实现类)的静态函数,在静态函数内定义一个switch case实现动态地选择返回的对象。假如,用实现计算器的代码作为例子。创建一个运算类的接口(方便多态的实现,向上转型):

interface Operation{
int calculateResult(int a, int b);
}


然后编写具体的实现类,以加法为例:

class OperationAdd implements Operation{
public int calculateResult(int a, int b){
return a+b;
}
}


类似的,定义实现类OperationMinus、OperationMultiply and OperationDivide。

然后创建了一个简单工厂类:

public class SimpleFactory{
public static Operation getOperation(String s){//用到了向上转型
switch(s){
case "add": return new OperationAdd();break;
case "minus": return new OperationMinus();break;
......
}
}
}


然后每次客户端调用不同的运算时,只需要在调用简单工厂类的getOperation方法并修改输入的字符串参数即可。即可获得相应运算符的对象。代码如下:

public static void main(String[] args){
Operation op = SimpleFactory.getOperation("+");
int result = op.calculateResult(1,1);
}


但这个方法,有个最大的缺陷在于,如果需要增加运算符,需要修改简单工厂类,不符合封闭、开放原则。根据上述原则,增加功能时,应该修改客户端代码实现。因为对客户端的代码修改是应该开放的,但对工厂类的修改应该是封闭的。所以,诞生了工厂方法模式:

这个模式就是把简单的工厂类分解成多个工厂方法子类,把对象的实例化推迟到了子类中实现。然后,提供了抽象的工厂方法接口,让具体的工厂方法实现类去实现。

interface FactoryMethod{
Operation getOperation();
}


然后加法的实现类是:

public class FactoryMethodAdd{
Operation getOperation(){
return new OperationAdd();
}
}


类似可以定义减、乘、除。

客户端代码是:

public static void main(String[] args){
FactoryMethod ins = new FactoryMethodAdd();//接口的引用指向实现类,称为接口回调
Operation op = ins.getOperation();
int result = op.calculateResult(1,1);
}


这样,每次增加一个运算符时,需要创建增多一个子类,并修改客户端代码即可。符合了封闭、开放原则。

P.S. 关于开放-封闭原则的详述:

开放封闭原则是针对新需求做准备原则。设计工程时,需要考虑未来将要加入的新需求。但是,新需求加入时,不应该修改原来已经写好的代码。取而代之,应该针对新需求再增加一段对应的功能实现代码。典型的实现方法是:利用继承、多态的性质,在同一个功能接口下,针对不同的需求实现不同的类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息