简单工厂模式

简单工厂模式:类的创建模式,又叫做静态工厂方法模式。
由一个工厂决定创建出哪一种产品类的实例。工厂模式专门负责将有大量共同接口的类实力化,工厂模式可以动态的决定将哪一个类实例化,不必事先知道每次要实力化哪一个类。工厂模式有以下几种形式:
简单工厂模式:又称静态方法模式。
工厂方法模式:又称多态性工厂模式或虚拟构造子模式。
抽象工厂模式:又称工具箱模式。
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
简单工厂模式涉及到工厂角色,抽象产品角色以及具体产品角色等三类角色:
工厂类(creator)角色:担当这个角色的是工厂方法模式的核心,含有与应用紧密相关的商务逻辑。工厂类在客户端的直接调用下创建产品对象。它往往由一个具体JAVA类实现含有一个静态的对象创建方法。
public clss Creator{
 public static Product factory(){
  return new ConcreateProduct();
 }
}
抽象产品(product)角色:担当这个角色的类是由工厂方法模式所创建的对象的父类,或他们共同拥有的接口。抽象产品角色可以用一个JAVA接口或是一个JAVA抽象类来实现。
public interface Product{

}
具体产品(conctete product):工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体JAVA类实现。
public class ConcreteProduct implements Product{
 public ConcreteProduct(){
 }

}

使用JAVA接口或者JAVA抽象类:
如果模式所产生的具体产品类彼此之间没有共同的商业逻辑,那么抽象产品角色可以由一个JAVA接口来扮演;相反如果这些具体产品彼此之间确实有共同的商业逻辑,那么这些公有的逻辑就应当移到抽象角色里面,这就意味着抽象角色应当由一个抽象类扮演。在一个类型的等级结构里面,共同的代码应当尽量向上移动,以达到共享的目的。

单例模式和多例模式是建立在简单工厂模式基础上的,而且它们都要求工厂方法具有特殊的逻辑,以便循环使用产品实例。
在很多的情况下,产品对象可以循环使用,也就是说工厂方法可以循环使用已经创建出来的对象,而不是每一次都是创建新的对象。工厂方法可以通过登记它所创建的产品对象来达到循环使用产品对象的目的。如果工厂方法总是循环使用同一个产品对象,那么这个工厂对象可以使用一个属性来存储这个产品对象,每一次客户端调用工厂方法时候,工厂方法总是提供着同一个对象。在单例模式中就是这样。如果工厂方法永远循环使用固定数目的一些产品对象,而且这些产品对象的数目并不大的话,可以使用一些私有属性存储对这些产品对象的引用。比如,一个永远只提供一个产品对象的工厂对象可以使用一个静态变量存储对这个产品对象的引用。相反,如果工厂方法使用数目不确定,或者数目较大的一些产品对象的话,使用属性变量存储对这些产品对象的引用就不方便了,这时就应当使用聚集对象存储对产品对象的引用。

简单工厂方法模式和一些模式的关系:
单例模式:
单例模式使用了简单工厂模式,单例类具有一个静态工厂方法提供自身的实例。但是单例模式并不是简单工厂模式退化情形,单例模式要求单例类的构造子是私有的,从而客户端不能直接将之实例话,而必须通过这个静态工厂方法将之实例话,而且单例类自身是自己的工厂角色。换言之,单例类自己负责创建自己的实例。单例类使用一个静态属性存储自己唯一的实例,工厂方法永远提供这一个实例。
多例模式:
多例模式是对单例模式的推广。多例模式与单例模式的共同之处在于它们都禁止外界直接将之实例化,同时通过静态工厂方法向外界提供循环使用的自身的实例。它们不同在于单例模式仅有一个实例,而多例模式可以有多个实例。多例模式往往具有一个聚集属性,通过向这个属性登记已经创建过的实例可以达到循环使用实例的目的。
备忘录模式:
单例模式和多例模式使用一个属性或者聚集属性来登记所创建的产品对象,以便可以通过查询这个属性或者聚集属性找到并共享已经创建了的产品对象,这就是备忘录模式的应用。
MVC模式:
MVC模式不是严格意义上的设计模式,而是更高层次的构架模式。MVC模式可以分解称为几个设计模式的组合,包括合成模式,策略模式,观察者模式,也可能会包括装饰模式,调停者模式,迭代子模式以及工厂方法模式等。简单工厂模式所创建的对象往往属于一个产品等级结构,这个登记结构可以是MVC模式中的视图,而工厂角色本色可以是控制器。一个MVC模式可以有一个控制器和多个视图。

简单工厂模式优缺点:
优点:
模式的核心是工厂类,这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅是“消费”产品。
缺点:
当产品类有复杂的多层次等级结构的时候,工厂类只有它自己,以不变应万变,就是模式的缺点。将全部逻辑集中放在一个类里面,当产品类有不同的接口种类的时候,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来的功能扩展的时候较为困难。由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。“开-闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展功能。当新产品加入系统中的时候,而无需要对现有代码进行修改。这一点对于产品的消费角色是成立的,而对于工厂角色是不成立的。对于工厂角色增加新的产品是痛苦的。

简单工厂方法在JAVA中应用:
DateFormat格式化本地日期或时间
public final static DateFormat getDateInstance()..;
public final static DateFormat getTimeInstance()..;
显然它提供的是它的子类的一个实例,充分运用了多态性和静态工厂方法。

女娲捏土造人:
女娲需要用土造出一个个的人,这就是简单工厂模式的引用。
工厂类:女娲是简单工厂模式的核心角色。
具体产品:一个个人,包括张三,李四等,这些人是简单工厂模式里面的具体产品。
抽象产品:最早只存在女娲头脑里的一个想法。

你可能感兴趣的:(简单工厂模式)