工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式的意图就是定义一个创建对象的接口,让其子类自己决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类中进行。
这种方法的优点:调用者想创建一个对象,只需要知道其名称就可以、扩展性高,如果要增加一个产品,只要扩展一个工厂类就可以、屏蔽了产品的具体实现,调用者只需要关心产品接口。
缺点:每次增加一个新产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,需要斟酌使用。
模式类图:
下面以一个简单计算器的例子实现简单工厂模式
由于需要获得运算的操作数所以这里选用了抽象类,但是和接口的作用是一样的,getresult()方法延迟到子类中实现。
package simplefactory.study.factory;
public abstract class Operation {
// 操作数
private double numberA;
private double numberB;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
// 获得计算结果
public abstract double getresult();
}
子类对于加减乘除的实现
package simplefactory.study.factory;
public class OperateAdd extends Operation {
@Override
public double getresult() {
double result = getNumberA() + getNumberB();
return result;
}
}
package simplefactory.study.factory;
public class OperateSub extends Operation {
@Override
public double getresult() {
double result = getNumberA() - getNumberB();
return result;
}
}
package simplefactory.study.factory;
public class OperateMul extends Operation {
@Override
public double getresult() {
double result = getNumberA() * getNumberB();
return result;
}
}
package simplefactory.study.factory;
public class OperateDiv extends Operation {
@Override
public double getresult() {
double result = 0;
if (getNumberB() == 0) {
System.out.println("除数不能为0");
} else {
result = getNumberA() / getNumberB();
}
return result;
}
}
工厂类,根据不同需求实例化不同对象package simplefactory.study.factory;
public class OperateFactory {
public static Operation createOperate(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new OperateAdd();
break;
case "-":
operation = new OperateSub();
break;
case "*":
operation = new OperateMul();
break;
case "/":
operation = new OperateDiv();
break;
}
return operation;
}
}
package simplefactory.study.factory;
public class Test {
public static void main(String[] args) {
// 获得抽象对象
Operation operation;
// 选择计算类型
operation = OperateFactory.createOperate("+");
operation.setNumberA(4);
operation.setNumberB(13);
// 获得结果
double result = operation.getresult();
System.out.println(result);
}
}
这样的代码实现方式不管是什么样的显示方式,或者增加平方、开方运算等运算方式都只需要增加相应的运算子类修改运算工厂类就可以,不管新增的方法是否有问题都不会影响到我们已经存在的方法,提升了系统的健壮性。