原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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