工厂设计模式浅析

如题所述

第1个回答  2022-05-30

就像六大原则一样,每一种设计模式也都是一种思想,而不是一种特定的形式,所以要灵活求变。这次简单分析一下工厂设计模式在实际开发当中的应用。工厂设计模式分为三大类: 简单工厂、工厂方法、抽象工厂 。而工厂方法又分为两种形式:单工厂形式和多工厂形式。这次将结合数据存储的三种类型,对工厂模式的各个形式来分析一下。这三种类型分别是内存存储(LRUCache)、SharedPreferece、Disk磁盘存储,它们将作为产品由工厂生产。

下面我们先定义一个产品存取数据的接口,它将作为三种类型的数据存储的规范。

上面定义了 String 、int、boolean三种数据类型存取的抽象方法,这里可以扩展。然后我们分别定义三种数据存储类型的实现类:

上面 MemoryHandler 继承自 ISaveHandler ,实现LruCache 内存缓存。

上面 SharedPreferenceHandler 继承自 ISaveHandler ,实现SharedPreference 缓存。还有磁盘缓存就不写了,有兴趣的可以自己扩展。这里主要讲解一下工厂设计模式。下面开始写简单工厂,简单确实也很简单,一个工厂一个switch语句:

上面就是通过传入的枚举类型生成相应的存储对象。不多说,看一下用法吧:

这种枚举类型的简单工厂模式好处就是清楚明了类型少,没那么多拐弯抹角。不好的地方就是,当数据存储类型(产品类型)需要扩展的时候,需要改动工厂。下面我们来看一下第二种:工厂方法模式。

开头说了,工厂方法模式由两种形式,一种是多工厂形式,一种是单工厂形式。

上面我们看到了一个工厂里面一个方法,就用于生成 SharedPreference形式的存储。如果要生成其他形式的存储,那么就再造一个相应的工厂。别的工厂这里就不贴出来了。其实这种方式更加一目了然,但缺点也很一目了然,就是工厂贼多。那下面就看一下工厂比较少的形式。

上面就是通过类型,然后反射获取存储类型的对象。这种模式和简单工厂有点类似,只不过这里不需要维护枚举类。当需要扩展数据存储方式时,只需要增加数据存储类型就可以了,并不需要改变工厂。这种方式应该是应用最广泛的一种工厂模式。下面再简单看下它的使用吧:

抽象工厂模式其实和工厂方法的多工厂模式有点类似,容易混淆。这两者的区别是,单工厂方法模式下,一个工厂只能生产一个产品,而抽象工厂模式下,一个工厂需要生产一组产品。比如我这里需要一个工厂能同时生产内存存储对象和SharedPreferece对象。或者,一个工厂能同时生产内存存储对象和磁盘存储对象等等。在实际开发过程中,如果用到了这种抽象工厂模式,那么一般来说,一个工厂能生产的这两个对象之间会有一定的关联性。比如说汽车工厂,它能同时生产出轴承和轮胎,这两者关系就很密切。下面看一下抽象工厂模式:

上面一个工厂可以生产两种产品,当然,上面例子里面工厂的两种产品木有很强的关联。刚才说了,使用到这种抽象工厂方式时,一般一个工厂的产品之间会有一定的关联。就像汽车的轴承和轮胎。相对来说,在日常的开发当中,工厂方法模式可能应用的更广泛一些。
Demo: Factory