简单工厂模式

简单工厂模式是类的创建模式,又叫静态工厂方法(static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
工厂模式的几种形态
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
1.简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)。
2.工厂方法(Factory Method )模式:又称多态性工厂模式(Polymorphic Factory)或虚拟构造子模式(Virtual Constructor )。
3.抽象工厂(Abstract Factory)模式:又称工具箱模式(Kit 或者 Toolkit)。
       简单工厂模式是不同的工厂方法模式的一个特殊实现。在java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂方法模式,因为一个方法是不是静态的,对java语言来说是一个很大的区别,必须在一开始就考虑。
简单工厂模式的结构
      简单工厂模式就是类的创建模式,简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。如下图:
简单工厂模式

从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色:

  1. 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现。
  2. 抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象角色可以是一个java接口或者是java抽象类。
  3. 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体java类实现。
工厂类的示意性源代码如下:

  创建了一个新的具体产品的实例并返还给调用者。
    Creator.java :

package com.model.builder;

public class Creator {
		
    /**
    * 静态工厂方法
    */
	public static Product factory(){
		
		return new ConcreteProduct();
	}
}

抽象产品角色的主要目的是给所有的具体产品类提供一个共同的类型,在最简单的情况下可以简化为一个标示接口。 

 Product.java


package com.model.builder;

public interface Product {

	
}


ConcreteProduct.java

package com.model.builder;

public class ConcreteProduct implements Product {
	
	public ConcreteProduct(){
		
	}

}
      虽然在这个简单的示意性实现里只给了一个具体类产品,但在实际应用中一般会遇到多个具体产品类的情况。

简单工厂模式的实现 
     使用java接口或者java抽象类:
如果模式所产生的具体产品类,彼此之间没有共同的商业逻辑,那么抽象产品角色可以由一个java接口扮演,相反如果这些具体产品彼此之间确实有共同的商业逻辑,那么这些共有的逻辑就应当移动到抽象角色里,这时抽象角色应当由抽象类下担任,在一个类型的等级结构里,共同的代码应当尽量往上移,以达到共享的目的,如下图:
                           简单工厂模式
多个工厂方法
      每个工厂类可以有多于一个的工厂方法,分别负责创建不同的产品对象,
抽象产品角色的省略
      如果系统仅有一个具体产品角色的话,那么就可以省略掉抽象产品角色。如下图: 
                                     
产品对象的循环使用和登记式的工厂方法:
      由于简单工厂模式是一个非常基本的模式,因此它会在较为复杂的设计模式中出现,在前面所给的示意例子中,工厂方法总是简单的调用产品类的构造方法创建一个新的产品实例,然后将实例提供给客户端,而在实际情况中工厂方法所做的事相当复杂。  
     在很多情况下,产品对象可以循环使用,换而言之,工厂方法可以循环使用已经创建出来的对象,而不是每一次都创建新的产品对象。工厂方法可以通过登记它所创建的产品来达到循环使用的目的。
      如果工厂方法总是循环使用同一个产品对象,数目固定,并且数目不大,那这个工厂对象可以使用一个属性来存储这个产品对象;相反,如果工厂方式使用数目不定,或者数目较大,这时使用属性变量存储这些产品对象的引用就不合适了,这是就应当使用聚集对象存储产品对象的引用。
简单工厂模式与其他模式的关系
单例模式 

      单例模式使用了简单工厂模式,单例类具有一个静态工厂方法提供自身的实例,一个抽象产品类同时是子类的工厂。
但是单例模式并不是简单工厂模式退化的情形,单例模式要求单例类的构造方法是私有的,从而客户端不能直接将之实例化,而必须通过这个静态工厂方法将之实例化,而且单例类自身是自己的工厂角色,换而言之,单例类自己负责创建自己的实例。
多例模式 
      多例模式是单例模式的推广,多例模式与单例模式的共同之处在于它们都禁止外界直接将之实例化,同事通过静态工厂方法向外界提供循环使用自身的实例。它们的不同在于单例模式仅仅有一个实例,而多例模式则可以有多个实例。
     多例模式往往具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的,一般而言,一个典型的多例类具有某种内部状态,这个内部状态可以用来区分各个实例,而对应于每一个内部状态,都只有一个实例存在。根据外界传入的参量,工厂方法可以查询自己的登记聚集,如果这个状态的实例已经存在,就直接将这个实例返回给外界,反之,就创建一个满足条件的新实例,将之登记到聚集中,在提供给客户端。
简单工厂模式的优点和缺点 
    优点:模式的核心是工厂类,这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品实例的责任,仅仅负责“消费”产品,实现了责任的分割。
     缺点:当产品含有复杂的多层次结构时,工厂类只有它自己。这个工厂类集中了所有产品创建的逻辑,将这么多逻辑放在一个类里面,当产品有不同的接口种类时,工厂类需要判断在什么时候创建某种产品,这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时比较困难,这一缺点在工厂模式方法中得到克服。
             由于简单工厂模式使用的是静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构,这一缺点在工厂方法模式中得到克服。

      
 


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