一、简单工厂模式
简单工厂模式将对象的建立与使用解耦,由工厂负责创建具体对象,应用需要对象时只需调用工厂类的API即可。
比如编写一个计算器、可使用工厂模式
如上图所示,加减乘除分别继承Operation类,重写getResult方法。
ComputerFactory为工厂类
public class ComputerFactory {
//由工厂类根据不同运算符生成需要的执行的操作
public static Operation getOperation(char operate){
Operation operation = null;
switch (operate){
case '+':
operation = new Add();
break;
case '-':
operation = new Sub();
break;
case '*':
operation = new Mul();
break;
case '/':
operation = new Div();
break;
}
return operation;
}
}
计算器工厂可根据操作符返回具体的操作类,实现应用和对象创建的解耦。
二、策略模式
虽然简单工厂模式实现了对象创建和应用的解耦,但当需求频繁发生变化是,比如需要添加一个sqrt
运算,这种问题可用策略模式解决。
策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。UML结构图如下。
Context上下文
Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化,计算器的Context如下
public class Context {
//strategy
public Operation operation = null;
public Context(char operate){
switch (operate){
case '+':
operation = new Add();
break;
case '-':
operation = new Sub();
break;
case '*':
operation = new Mul();
break;
case '/':
operation = new Div();
break;
}
}
//由Context执行封装好的算法
public double doWork(int num1,int num2){
operation.setNum1(num1);
operation.setNum2(num2);
return operation.getResult();
}
}
Strategy就是计算器中的Operation。
三、两种模式的客户端调用
public class Main {
public static void main(String[] args) {
//请求工厂返回需要的运算实例
Operation operation = ComputerFactory.getOperation('+');
operation.setNum1(12);
operation.setNum2(23);
System.out.println(operation.getResult());//由工厂返回的实例执行运算
//生成算法定义的策略上下文
Context context = new Context('-');
System.out.println(context.doWork(1,2));//由context去执行算法,降低算法和调用者的耦合
}
四、总结
工厂模式中只管生产实例,具体怎么使用工厂实例由调用方决定,策略模式是将生成实例的使用策略放在策略类中配置后才提供调用方使用。 工厂模式调用方可以直接调用工厂实例的方法属性等,策略模式不能直接调用实例的方法属性,需要在策略类中封装策略后调用。