由工厂对象决定创建出具体的产品类。业务类只需关注相应的业务方法。工厂类通过业务类传来的参数动态决定应该创建哪个产品类的实例。
具体角色:
工厂(Creator)角色:简单工厂模式的核心。它负责实现创建所有具体产品类的。工厂类的创建方法可以被外界直接调用以创建具体的产品类实例。
抽象产品(Product)角色:简单工厂模式创建的所有产品类的父类,负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂模式创建的目标。所有创建的对象都是莫个具体产品类的实例。
UML模型图
例:
需求:
现在需要设计一个计算器,输入限两个数字。可以实现加减乘除,后期可随时增加运算方法。
实现思路:
客户端进行输入并进行选择相应的运算方法,可定义一个计算机类,在创建的时候向其输入相应的运算符号,返回具体的运算方法实现类,调用其公共方法进行运算。
1:定义一个运算类,里面写好要进行运算的方法。
如何通过运算符来进行运算呢?
2.1:可以在运算类的运算方法通过if,else进行判断选择,不过耦合度太高。
后期若要增加新的运算,需要对原有类进行修改,不安全且修改起来也不方便。
2.2:可以为每一个运算方法写一个具体的实现类并继承运算类重写运算方法,可以动态增加新的运算方法,只需要新增运算方法的具体实现类就好了。如果想要哪种方法,直接在业务类new出相应的方法对象。但是业务类每写一种新的运算方法都要new 一个不同的实现类,后期维护不方便。
2.3:可以为每一个运算方法写一个具体的实现类并继承运算类重写运算方法,可以动态增加新的运算方法,只需要新增运算方法的具体实现类就好了。然后在创建一个工厂类,专门负责创建具体实现类的实例。工厂类如何创建具体实现类的实例呢,业务类可以在调用工厂类时传输进一个参数,由工厂进行选择具体实例化哪个对象。
代码实现
抽象产品(Product)角色
package cn.operation;
/**
* 抽象产品角色,定义运算的公共方法
*/
public abstract class Operation {
public static final long timebegin=System.currentTimeMillis();
public double numberA =0;
public double numberB=0;
public abstract double getResult() throws Exception;
}
工厂(Creator)角色
package cn.operation;
/**
* 运算工厂类
*/
public class OperationFactory {
public static Operation createOperation(String operate){
Operation oper=null;
if ("+".equals(operate)) {
oper=new OperationAdd();
}else if ("-".equals(operate)) {
oper=new OperationSub();
}else if ("*".equals(operate)) {
oper=new OperationMul();
}else if ("/".equals(operate)) {
oper=new OperationDiv();
}
return oper;
}
}
具体产品(Concrete Product)角色
加法运算实现类:
package cn.operation;
/**
* 加法实现类
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA+numberB;
}
减法运算实现类:
package cn.operation;
/**
*减法实现类
*/
public class OperationSub extends Operation {
@Override
public double getResult() throws Exception {
// TODO Auto-generated method stub
if (numberB==0) {
throw new Exception("除数不能为0");
}
return numberA/numberB;
}
}
除法运算实现类
package cn.operation;
/**
*减法实现类
*/
public class OperationDiv extends Operation {
@Override
public double getResult() throws Exception {
// TODO Auto-generated method stub
if (numberB==0) {
throw new Exception("除数不能为0");
}
return numberA/numberB;
}
}
乘法运算实现类
package cn.operation;
/**
* 乘法实现类
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
// TODO Auto-generated method stub
return numberA*numberB;
}
}
调用工厂业务类
package cn.operation;
/**
*调用工厂业务类
*/
public class OperationClient {
public static void main(String[] args) throws Exception {
Operation oper= OperationFactory.createOperation("*");
oper.numberA=12;
oper.numberB=20;
System.out.println(oper.getResult());
}
}