1. 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
2. 简单工厂模式的简略类图:
3. 简单工厂模式的一般性结构:
4. 简单工厂模式就是由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例:
简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色:
a) 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。
b) 抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口或者Java 抽象类实现。
c) 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现。
5. 简单工厂模式的示意性源代码如下:
- //工厂
- public class Creator
- {
- /**
- * 静态工厂方法
- */
- public static Product factory()
- {
- return new ConcreteProduct();
- }
- }
- //抽象产品
- public interface Product
- {
- }
- //具体产品
- public class ConcreteProduct implements Product
- {
- public ConcreteProduct(){}
- }
//工厂public class Creator{/*** 静态工厂方法*/public static Product factory(){return new ConcreteProduct();}}//抽象产品public interface Product{}//具体产品public class ConcreteProduct implements Product{public ConcreteProduct(){}}
6. 如果产品形成复杂的等级结构,简单工厂模式采取的是以不变应万变的策略,一律使用同一个工厂类:
这样做的好处是设计简单,产品类的等级结构不会反映到工厂类中来,从而产品类的等级结构的变化也就不会影响到工厂类。但是这样做的缺点是,增加新的产品必将导致工厂类的修改。
7. 每个工厂类可以有多于一个的工厂方法,分别负责创建不同的产品对象。
8. 在有些情况下, 工厂角色可以由抽象产品角色扮演。一个抽象产品类同时是子类的工厂。
9. 工厂方法可以循环使用已经创建出来的对象,而不是每一次都创建新的产品对象。工厂方法可以通过登记它所创建的产品对象来达到循环使用产品对象的目的。
10.单例模式使用了简单工厂模式。单例类具有一个静态工厂方法提供自身的实例。但是单例模式并不是简单工厂模式的退化情形,单例模式要求单例类的构造子是私有的,从而客户端不能直接将之实例化,而必须通过这个静态工厂方法将之实例化,而且单例类自身是自己的工厂角色。单例类使用一个静态的属性存储自己的惟一实例,工厂方法永远仅提供这一个实例。
11.多例模式是对单例模式的推广。多例模式与单例模式的共同之处在于它们都禁止外界直接将之实例化,同时通过静态工厂方法向外界提供循环使用的自身的实例。它们的不同在于单例模式仅有一个实例,而多例模式则可以有多个实例。多例模式往往具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的。
12.单例和多例模式使用了一个属性或者聚集属性来登记所创建的产品对象,以便可以通过查询这个属性或者聚集属性找到和共享已经创建了的产品对象。这就是备忘录模式的应用: