工厂模式和策略模式
相同点
都使用多态抽取了相同的行为,比如人类都有吃饭、睡觉行为。
相同片段
抽象类(接口)
写一个计算接口,里面抽取了计算功能。
public interface Counter {
public double getResult(double num1, double num2);
}
各个运算类
加、减、乘、除类实现计算接口,重写各自的计算行为。
public class Add implements Counter {
@Override
public double getResult(double num1, double num2) {
return num1 + num2;
}
}
public class Sub implements Counter {
@Override
public double getResult(double num1, double num2) {
return num1 - num2;
}
}
public class Mul implements Counter {
@Override
public double getResult(double num1, double num2) {
return num1 * num2;
}
}
public class Div implements Counter {
@Override
public double getResult(double num1, double num2) {
return num1 / num2;
}
}
不同片段
工厂模式 -> 工厂类
工厂类用途是根据计算需求创建对象,我们可以用多个静态方法来实现,也可以使用方法传参来判断创建。
public class CountFactory {
public static Counter getAdd() {
return new Add();
}
public static Counter getSub() {
return new Sub();
}
public static Counter getMul() {
return new Mul();
}
public static Counter getDiv() {
return new Div();
}
}
策略模式 -> 上下文类
策略模式使用构造方法来接收对象,根据需求执行该对象方法。
public class Context {
private Counter counter;
public Context(Counter counter) {
this.counter = counter;
}
public double executeCounter(double num1, double num2) {
return counter.getResult(num1, num2);
}
}
测试类
测试工厂模式和策略模式。
/**
* @Description: 工厂测试
* @auther: liucong
* @date: 2020/8/14 10:02
* @return:
*/
@Test
public void test01() {
Counter add = CountFactory.getAdd();
System.out.println(add.getResult(1, 6));
}
/**
* @Description: 策略测试
* @auther: liucong
* @date: 2020/8/14 10:02
* @return:
*/
@Test
public void test02() {
Context context = new Context(new Add());
System.out.println(context.executeCounter(3, 5));
}
结论
- 工厂模式和策略模式都对各自操作类共性抽取;
- 工厂模式工厂类侧重于对象的创建,方法的执行在测试类中调用;
- 策略模式上下文类侧重于行为的调用,对象在上下文类中已创建好了。