(Factory Method)工廠方法模式的Java實現

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://haolloyin.blog.51cto.com/1177454/332576            

               

   

工廠方法模式(Factory Method):定義一個用於創建對象的接口IFactory,在具體的ConcreteFactory子類中根據傳進的參數即具體子類ConcreteProduct決定實例化哪一個IProduct產品,該模式使得一個類(即IProduct)的實例化延遲到其子類(即ConcreteProduct)。

通用類圖如下:

代碼實現如下:

  // 產品接口,定義一系列產品應該實現的服務,即產品的共性
  interface IProduct {
    public void method01();
    public void method02();
  }
    
  // 具體的產品實現類
  class ConcreteProductA implements IProduct {
    public void method01() {
      System.out.println("ConcreteProductA method01() ...");
    }
    public void method02() {
      System.out.println("ConcreteProductA method02() ...");
    }
  }
    
  class ConcreteProductB implements IProduct {
    public void method01() {
      System.out.println("ConcreteProductB method01() ...");
    }
    
    public void method02() {
      System.out.println("ConcreteProductB method02() ...");
    }
  }
    
  // 抽象的工廠類,定義了其子類必須實現的createProduct()方法
  abstract class Factory {
    //運用了Java 中的泛型和反射技術
    public abstract <T extends IProduct> T createProduct(Class<T> c);
  }
    
  class ConcreteFactory extends Factory {
    public <T extends IProduct> T createProduct(Class<T> c) {
      T product = null;
      try {
        product = (T) Class.forName(c.getName()).newInstance();
      } catch (Exception e) {
        e.printStackTrace();
      }
      return product;
    }
  }
    
  public class Client {
    public static void main(String[] args) {
      //創建一個具體工廠
      Factory factory = new ConcreteFactory();
      //根據參數中具體產品的.class名稱來決定創建的產品類型
      IProduct product01 = factory.createProduct(ConcreteProductA.class);
      IProduct product02 = factory.createProduct(ConcreteProductB.class);
        
      product01.method01();
      product01.method02();
      product02.method01();
      product02.method02();
    }
}

實際上,具體的產品子類(即ConcreteProduct)可以有多個,以上只用了兩個;而且具體的工廠(即ConcreteFactory)也可以有多個,不同的工廠可以提供不同的創建產品的實現方式,即使用不同的方式來覆蓋實現父類中的抽象createProduct()方法。

我們可以將工廠方法模式中的產品理解爲對外的服務,而IProduct接口僅僅只是制定一個標準,即每個產品(服務)必須對外提供的接口(這個“接口”是概念上的,不是上面那種編程語言級別的關鍵字interface“接口”)。

我們可以對上面這個工廠方法模式進行擴展。

1、例如,當我們並不需要創建一個工廠的時候(畢竟有時候我們可能只需要不多的幾個產品而已),可以省略掉抽象的Factory類,直接設計一個具體的Factory類,由其提供一個靜態方法來根據傳進的參數進行適當的實例化操作,此時就變成了簡單工廠模式了。

2、再者,我們可以根據需要設計不同的具體工廠類(即不同的ConcreteFactory類),此時讓不同的具體工廠類ConcreteFactory與不同的產品類ConcreteProductl類一一對應,用不同的工廠來生產不同的產品(或者說不同的提供商來實現對外的不同服務)。修改一下類圖即可,具體類圖如下:

3、最後,可以使用工廠方法來實現對象實例化的延遲,這樣做的好處是不必在某個產品還未被需要之前就創建出來,可以等到真正需要時再實例化並將其裝進一個容器中,以備以後的訪問需要,具體類圖也只是將上面類圖中的抽象Factory類與IProduct接口的依賴關係改成聚合關係即可,具體的代碼實現也比較簡單,這裏不再給出。

本文出自 “螞蟻” 博客,請務必保留此出處http://haolloyin.blog.51cto.com/1177454/332576

   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章