1. 程式人生 > >設計模式學習系列之二——工廠方法模式(Factory Method)

設計模式學習系列之二——工廠方法模式(Factory Method)

工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程式系統可以說是隨處可見。

    為什麼工廠模式是如此常用?因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如:

    A a = new A ();

    工廠模式也是用來建立例項物件的,所以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。

    我們以類Sample為例, 如果我們要建立Sample的例項物件:

    Sample sample=new Sample();

    可是,實際情況是,通常我們都要在建立sample例項時做點初始化的工作,比如賦值 查詢資料庫等。

    首先,我們想到的是,可以使用Sample的建構函式,這樣生成例項就寫成:

    Sample sample=new Sample(引數);

    但是,如果建立sample例項時所做的初始化工作不是象賦值這樣簡單的事,可能是很長一段程式碼,如果也寫入建構函式中,那你的程式碼就很難看了,需要重構(Refactor)。

    所以我們應該考慮用工廠方法模式,其結構圖如下:

    我們假定一個工廠介面Factory要生產一種產品,我們還在計劃階段,不知道產品的細節,所以也給它一個抽象介面Product。完成計劃後,我們開始考慮實施了,這時我們已經瞭解了產品和生產的具體詳細情況,我們就有了兩個具體類ConcreteFactory和ConcreteProduct。ConcreteFactory的operation方法負責具體生產情況。原始碼如下:

/**
 * Factory interface
 *
 * @version 0.00
 * @author  Barret_Qin
 */
public interface Factory {
 Product factoryMethod();
}

/**
 * Concrete factory
 *
 * @version 0.00
 * @author  Barret_Qin
 */
public interface ConcreteFactory {
 public Product factoryMethod() {

     return new ConcreteProduct();

 }
}

/**
 * Product interface
 *
 * @version 0.00
 * @author  Barret_Qin
 */
public interface Product {
 void operation();
}

/**
 * Concrete product
 *
 * @version 0.00
 * @author  Barret_Qin
 */
public class ConcreteProduct implements Product {

 /* 

  * @see pattern.creational.factoryMethod.Product#operation()
  */
 public void operation() {
  System.out.println("I am from the operation of ConcreteProduct");
 }

}

/**
 * Test class
 *
 * @version 0.00
 * @author  Barret_Qin
 */
public class Tester {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Factory factory = new ConcreteFactory();
  Product product = factory.factoryMethod();
  product.operation();
 }

}


    我們用Tester類進行測試,其輸出結果應如下所示:

       I am from the operation of ConcreteProduct

    正如Tester類所示的那樣,我們要得到產品Product,只需要呼叫Factory的factoryMethod方法,而不必關心其具體實現細節。另外,即使該工廠轉型,開始生產其他產品,我們的客戶端也不需要任何修改。