前言:加入阿里三周了,最近在开发项目的过程中遇到一个场景,结合使用了简单工厂与策略模式,稍微回想了一下,发现再次想不明白策略模式与简单工厂模式之间的区别了,就以此为契机发ATA的第一篇文章吧,想直接看结论的可以跳到最后。
1.简单工厂
类图见下:

全部的代码见git:https://github.com/somewaters/designPattern/tree/master/src/main/java/simpleFactory
只贴一下client调用代码
AbstractProduct product = ProductFactory.createProduct("A");
product.method();
适用场景为:client不关心对象的创建,只需要传给工厂类参数,获取到生产的对象后使用即可,对client隐藏了对象创建的过程。
简单工厂的创建对象不一定必须要if,else来进行对象的创建。比如
if("A".equals(param)){
return new ProductA();
}else if("B".equals(param)){
new ProductB();
}else{
new ProductC();
}
可以使用map属性,使用Spring Ioc的bean配置文件来进行对象的创建,这样变动的时候,不用改原有的工厂方法,只要新加实现,对bean配置进行修改即可。满足开闭原则,比如
Map<String, AbstractProduct> productMap;
AbstractProduct createProduct(String param){
return productMap.get(param);
2.策略模式
类图见下

全部代码见git:https://github.com/somewaters/designPattern/tree/master/src/main/java/strategy
只贴一下Context和client代码
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void method(){
strategy.algorithm();
}
}
client代码
public class client {
public static void main(String[] args){
Context context = new Context(new StrategyA());
context.method();
}
}
适用场景:同一业务场景,不同分支处理不同导致的复杂if else,使用策略模式可以规避此类代码。
if(a){
handleA();
}else if(b){
handleB();
}else if(c){
handleC();
}
else{
handleD();
}
3.区别
重点来了,两种模式的区别是什么呢?
网上的答案一般是,简单工厂关注对象的创建,而策略模式关注的是行为,我是看不明白。我自己理解的最大区别,没有之一,即以clinet视角看,对象创建的可见性不同。
从clinet使用角度来说,简单工厂中,client不知道对象是如何创建的,对象创建对client是隐藏的。client代码见下
AbstractProduct product = ProductFactory.createProduct("A");
product.method();
而策略模式,client需要自己创建好对象new StrategyA()传递给context,即对象创建对client是可见的。client代码见下
Context context = new Context(new StrategyA());
context.method();
策略模式最典型的其实是treeMap的Comparator,你作为client是需要自己实现一个Comparator类传递给treeMap的。
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
到此,本文最关键的就结束了。
下面说说如何结合简单工厂和策略模式。
其实就是基于策略模式,将Context代码改造一下
public class Context {
private Strategy strategy;
//将Context初始化的方式变为简单工厂中的factory一样的逻辑即可。
public Context(Strategy strategy){
this.strategy = strategy;
}
public void method(){
strategy.algorithm();
}
}
网友评论