設計模式學習系列之二——工廠方法模式(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方法,而不必關心其具體實現細節。另外,即使該工廠轉型,開始生產其他產品,我們的客戶端也不需要任何修改。