定义

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

类型

创建型模式

介绍

工厂模式比较简单,我直接拿实际的一个例子说明
当前Android有三种key_value序列化方式,分别是SharedPreferences 、
MMKV、DataStore 。这三个库,各个项目都有分别使用,为了方便迁移。
我们可以使用一个Data接口,去规定里面的方法。如果后续有新的库,也
可以通过这个接口实现好,简单替换。

示例

定义一个接口,提供能力(只有了add方法做演示)

public interface Data {
    void add();
}

封装SharedPreferences 时使用Data接口规范能力

public class SharedPreferences implements Data {
    private  final String TAG = this.getClass().getSimpleName();

    @Override
    public void add() {
        Log.d(TAG, "使用SharedPreferences 进行add");
    }
}

封装MMKV 时使用Data接口规范能力

public class MMKV  implements Data{
    private  final String TAG = this.getClass().getSimpleName();
    @Override
    public void add() {
        Log.d(TAG, "使用MMKV 进行add");
    }
}

封装DataStore 时使用Data接口规范能力

public class DataStore implements Data {
    private final String TAG = this.getClass().getSimpleName();

    @Override
    public void add() {
        Log.d(TAG, "使用DataStore 进行add");
    }
}

简单静态工厂模式

通过使用DataFactory 类传入不同的类型,返回不同的Data库

public class DataFactory {
 public static final String SP = "SharedPreferences";
    public static final String MMKV = "MMKV";
    public static final String DATA_STORE = "DATA_STORE";

    /**
     * 创建一个IData类,默认是SharedPreferences
     *
     * @param type 类型
     * @return IData
     */
    public static IData create(String type) {
        IData iData = null;
        switch (type) {
            case MMKV:
                iData = new MMKVUtils();
                break;
            case DATA_STORE:
                iData = new DataStoreUtils();
                break;
            default:
                iData = new SharedPreferencesUtils();
                break;
        }
        return iData;
    }

}

这只是一个简单的例子,正常创建一个对象应该是更加复杂的。比如:创建一个类需要传入特定的参数,特定的参数中可能有一些复杂的类,还需要使用者去深入了解。还有一些类不能直接使用new出来的对象等等问题。

当然还有一种多方法工厂模式可能使用更加简单

public class DataFactory {

    public static final String SP = "SharedPreferences";
    public static final String MMKV = "MMKV";
    public static final String DATA_STORE = "DATA_STORE";


    public static IData getSharedPreferences() {
        return new SharedPreferencesUtils();
    }

    public static IData getMMKV() {
        return new MMKVUtils();
    }

    public static IData getDataStore() {
        return new SharedPreferencesUtils();
    }
 }

这种写法属于直接调用方法,甚至不需要查看工厂类有哪些成员变量。
两种都是属于简单工厂模式,选择一个方便理解的使用即可。其实在类型少的时候看起来区别不大,当类型多了,就看是使用if简单还是方法简单。

总结

工厂模式还是比较简单看懂的。通过上面示例,我们不管使用MMKV还是SharedPreferences ,add方法的参数和功能是一样的
具体怎么实现由各个类来完成。特别适合框架迁移。而且我们也不需要关心着三个Data框架是怎么创建出来的。
我们创建Data库对象时无需关注是怎么创建的,直接传入类型获取data对象
通过Data接口统一了,各个仓库提供的能力。

此模式不属于23种设计者模式,但是它是所有工厂模式的基础

更多推荐