快速引入
如果我们做某件事,把他交给另外一个人做完,而我只要得到答案即可,并不想知道过程,而且有可能这些事的细节不同,但是总归是一类事,你都得给我完成。就好像你是个土豪,去买车,我今年想要定制版的林肯加长,你造车厂给我造好就行了,明年又想要兰博基尼,你工厂又给我弄好就行了,我也不想知道你怎么弄好的,虽然我要的车都是不同的,但是你都得给我处理好。这个时候工厂可能就忙不过来了,就会把业务线发给旗下子工厂去完成,每个子工厂造一类车,而总工厂只进行把控。
实战
我们项目中做网络请求一样,获取到了数据,但是这个数据是json的,我们需要转换成实体类,尽管请求过来的数据可能不同,但是工厂模式都能应付。这个时候我们就需要一个抽象类来当“总工厂”了
public abstract class DataConverter {
//存放子工厂返回的结果(不用关心MultipleItemEntity只是一个实体类)
protected final ArrayList<MultipleItemEntity> ENTITIES = new ArrayList<>();
private String mJsonData = null;
//调用此方法返回解析结果
public abstract ArrayList<MultipleItemEntity> convert();
public DataConverter setJsonData(String json) {
this.mJsonData = json;
return this;
}
protected String getJsonData() {
if (mJsonData == null || mJsonData.isEmpty()) {
throw new NullPointerException("DATA IS NULL!");
}
return mJsonData;
}
public void clearData(){
ENTITIES.clear();
}
}
某一个分工厂,还可以有其他名字不同的分工厂这里只举一个例子
public class ShopCartDataConverter extends DataConverter {
@Override
public ArrayList<MultipleItemEntity> convert() {
//在这里将得到的json数据解析出来,放入ENTITIES中返回回去。
return ENTITIES ;
}
}
使用
//此段代码放在网络请求成功后的接口回调里,response是请求成功后的json数据
final ArrayList<MultipleItemEntity> data =
new ShopCartDataConverter()
.setJsonData(response)
.convert();
这里我举例的是购物车的数据,如果是其他数据,只需要建立相应的其他子工厂即可,然后调用的时候new子工厂的。
小结
工厂方法模式降低了对象之间的耦合度,将实例化的任务交由子类去完成,有非常好的扩展性,符合软件设计原则。
优点:
1.在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程
2.在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点:
1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。