介绍
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用 new 就可以完成创建的对象无需使用工厂模式。
它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品。
通用模式代码:
调用
这里我们得到的产品对象时 ConcreteProductA 的实例,如果想得到 ConcreteProductB 的实例,更改 ConcreteFactory 中的逻辑即可;或者是新建一个 Factory 的具体实现子类,专门生产 ConcreteProductB 的实例。当然,我们也可以利用反射的方式来简化操作。具体如下:
调用:
当我们的工厂只有一个的时候,可以简化掉抽象工厂类,并提供一个静态方法即可。
工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度。而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。
ANDROID 源码中的工厂方法模式
大家平时开发中经常会使用到的数据结构中其实也隐藏着对工厂方法模式的应用,以 List 和 Set 为例,List 和 Set 继承自 Collection 接口,而 Collection 接口继承于 Iterable 接口,Iterable 接口很简单,就一个 iterator 方法。
这意味着 List 和 Set 接口也会继承该方法,平时比较常用的两个间接实现类 ArrayList 和 HashSet 中的 iterator 方法的实现就是构造并返回一个迭代器对象。
ArrayList 中的 iterator 方法其实就相当于一个工厂方法,专为 new 对象而生,这里的 iterator 方法是构造并返回一个具体的迭代器。再看看下面的对应关系:
当然,Java 源码中对工厂方法的应用范例也不少,大家可以自己查看 Set 的源码。ANDROID 中对工厂方法模式的应用更多,读者其实第一次接触 ANDROID 时就已经遇到了但未察觉到,相信以下代码对一个 ANDROID 新手来说都不陌生。
这里构造一个线性布局 LinearLayout 对象并设置为当前 Activity 的根布局,这段代码看似再平常不过了,实质上,onCreate 方法就相当于一个工厂方法,为什么呢?因为我们知道 LinearLayout 是一个 ViewGroup,而 ViewGroup 又继承于 View,简单地说就是,所有控件都是 View 的子类,上面的代码中,我们在 TestActivity 的 onCreate 方法中构造一个 View 对象,并设置为当前界面的 ContentView 返回给 framework 处理,如果现在又有一个 LoginActivity,这时我们又在其 onCreate 方法中通过 setContentView 方法设置另外不同的 View,这是不是就是一个工厂模式的结构呢?其实设计模式离我们非常近。
示例:数据持久化
ANDROID 中数据持久化为我们提供了 SharePreference、 SQLite 和普通的文件存储等方式。但是对数据的操作都是增删改查,可以把这些共同的操作抽象出来作为抽象产品类,然后每一种持久化方法作为具体产品。
抽象产品中定义操作的方法,即增删改查。
具体的产品,持久化的类型,比如利用文件来持久化。
然后是我们的工厂方法,这里仍然采用反射的方式。
在需要进行数据持久化的地方调用工厂方法:
这里的例子简化了很多,还有数据库 SQLite 以及 SharePreference 的持久化的类就没有写了。