简单工厂模式实现的目标是使业务层和界面进行分离。还是举例说明:
现在有一个需求让你实现类似计算机的加减乘除功能,如果我们不是用设计模式思想,把所有的业务代码写到一个类中,也能实现需求但是,如果增加新的需求呢?比如我在原来的基础上增加开根的需求,那么你就要对已经写好的代码进行更改,极有可能出现把已经完成的代码“破坏”的情况,而且不利于别人对项目的二次开发。下面我们引入简单工厂模式:先贴出代码(Java)
业务层code
package com.lava.FactoryPattern;
/*
* 作为加减乘除的基类。
*/
public abstract class Operation {
public double numberA;
public 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 com.lava.FactoryPattern;
/*
* 加操作
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA+numberB;
}
}
package com.lava.FactoryPattern;
/*
* 减操作
*/
public class OperationSub extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA-numberB;
}
}
package com.lava.FactoryPattern;
/*
* 乘操作
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA*numberB;
}
}
package com.lava.FactoryPattern;
/*
* 除操作
*/
public class OperationDiv extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA/numberB;
}
}
简单工厂:
package com.lava.FactoryPattern;
/*
* 工厂模式
*/
public class OperationFactory {
public Operation getOper(char c){
Operation op=null;
switch (c){
case '+':
op=new OperationAdd();
break;
case '-':
op=new OperationSub();
break;
case '*':
op=new OperationMul();
break;
case '/':
op=new OperationDiv();
break;
}
return op;
}
}
控制台
package com.lava.FactoryPattern;
/*
* 控制台
*/
public class Main {
public static void main(String[] args) {
Operation oa=new OperationFactory().getOper('+');
oa.setNumberA(2);
oa.setNumberB(3);
System.out.println(oa.getResult());
}
}
把所有的功能作为不同的类分开看似繁琐,但是有一个极大的优势,如果要增加新的功能你只需要在业务层增加一个OperationSqrt.class 代码就不写了。下面总结一下这样写的优势:
总结:
1、存在的条件是以基类作为基础、很多子类继承它。这要如果没有工厂模式。你需要在控制台上new很多的对象,失去了控制台的意义,控制台不需要知道你具体是怎么实现的,它只要通过'+','-','*','/' 符号,传入数,得到结果就行。
2、在有多个子类时,工厂类的作用是,通过控制台输入的信息,判断我要实例化那个子类(多态特性)。传给控制台即可。
3、有新的需求比如开根,只需要增加OperationSqrt.class,在控制台增加Operation oa=new OperationFactory().getOper('sqr'); 这样实现了程序的灵活性,增强代码的可读性。
4、不需要更改已经写好的类。
简单工厂:控制台通过简单工厂模式知道具体调用了哪个子类。