简单工厂模式
工厂:用一个单独的类来完成创造实例的过程。
案例
类图:
class Operation{
private double numberA = 0;
private double numberB = 0;
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 double getResult() throws Exception{
double result = 0;
return result;
}
}
class Add extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
class Sub extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
class Mul extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
class Div extends Operation{
public double getResult() throws Exception
{
double result = 0;
if (getNumberB() == 0){
throw new Exception("除数不能为0");
}
result = getNumberA() / getNumberB();
return result;
}
}
//工厂:用一个单独的类来做这个创造实例的过程
class OperationFactory{
public static Operation createOperate(String operate){
Operation oper = null;
if(operate.equals("+")){
oper = new Add();
}else if(operate.equals("-")){
oper = new Sub();
}else if(operate.equals("*")){
oper = new Mul();
}else if(operate.equals("/")){
oper = new Div();
}
return oper;
}
}
public class SimpleFactoryTest {
public static void main(String[] args) throws Exception {
Operation oper = OperationFactory.createOperate("+");
oper.setNumberA(1);
oper.setNumberB(2);
double result = oper.getResult();
System.out.println(result);
}
}
在使用简单工厂模式的情况下,如果我们要增加新的功能,比如说现在要增加一个求余操作,
我们需要增加一个用于求余运算的类,然后在OperationFactory中增加对于求余运算的逻辑判断,这样的做法违背了
开放封闭原则,即在开放拓展的同时也开放了修改。
class Mod extends Operation{
public double getResult(){
double result = 0;
result = getNumberA() % getNumberB();
return result;
}
}
class OperationFactory{
public static Operation createOperate(String operate){
......
else if(operate.equals("%")){
oper = new Div();
}
......
}
}