一、简单工厂模式的结构
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。下面以一个示意性的实现为例说明简单工厂模式的结构如下图所示。
注:其中Creator类提供的是静态工厂方法,如:publicstatic Product factory(){}。
二、简单工厂模式与其他模式的关系
单例模式
单例模式使用了简单工厂模式。换言之,单例类具有一个静态工厂方法提供自身的实例,一个抽象产品类同时是子类的工厂。
多例模式
多例模式是对单例模式的推广。多例模式与单例模式的共同之处在于它们都禁止外界直接将之实例化,同时通过静态工厂方法向外界提供循环使用的自身的实例。它们的不同在于单例模式仅有一个实例,而多例模式则可以有多个实例。
多例模式往往具有 一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的。一般而言,一个典型的多例类具有某种内部状态,这个内部状态可以用来区分各个实例,而对应于每一个内部状态,都只有一个实例存在。
三、简单工厂模式在java中的应用
DateFormat与简单工厂模式
java.text.DateFormat与其子类用来格式化一个本地日期或时间,这个工具类在处理英语和非英语的日期及时间格式上很有用处。DateFormat与SimpleDateFomat类图如下:
DateFormatr的工厂方法是静态方法,并不是普通的方法。getDateInstance方法并没有调用DateFormat的构造子来提供自己的实例,作为一个工厂方法,getDateInstance方法做了一些有趣的事情。它所做的事情基本上可以分成两部分:一是运用多态性;二是使用静态工厂方法。SimpleDateFormat是抽象类DateFormat的具体子类,这就意味着SimpleDateFormat是一个DateFormat类型的子类型;而getDateInstance方法完全可以返回simpleDateFormat的实例,并且仅将它声明为DateFormat类型。这就是最纯正的多态性原则的运用。
这种将工厂方法的返还类型设置成抽象类型的做法,叫做针对抽象编程,这是依赖倒转原则(DIP)的应用。
SAX2库中的XMLReaderFactory与简单工厂模式