设计模式之工厂方法模式总结

快速引入

如果我们做某件事,把他交给另外一个人做完,而我只要得到答案即可,并不想知道过程,而且有可能这些事的细节不同,但是总归是一类事,你都得给我完成。就好像你是个土豪,去买车,我今年想要定制版的林肯加长,你造车厂给我造好就行了,明年又想要兰博基尼,你工厂又给我弄好就行了,我也不想知道你怎么弄好的,虽然我要的车都是不同的,但是你都得给我处理好。这个时候工厂可能就忙不过来了,就会把业务线发给旗下子工厂去完成,每个子工厂造一类车,而总工厂只进行把控。

实战

我们项目中做网络请求一样,获取到了数据,但是这个数据是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.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

猜你喜欢

转载自blog.csdn.net/HJsir/article/details/80286874
今日推荐