轉自:《Java 設計模式》2009年( 耿祥義 張躍平 著)設計模式
一,歸納:函數
工廠方法模式(別名:虛擬構造)設計
定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method 使一個類的實例化延遲到其子類。對象
二,引入blog
獲得一個類的子類的實例最經常使用的辦法使使用 new 運算符和 該子類的構造方法,可是在一般狀況下系統不容許用戶代碼和該類的子類造成耦合或者用戶不知道該類有哪些子類可用,好比有一個 抽象的 Car類,該類有兩個子類 ,Porsche類 和 QQCar類,而系統但願用戶用 Factory類的子類的實例 來獲得 Car類 的子類的實例。接口
爲此,在設計 Factory類 時,決定讓它依賴於 Car類,而且提供了一個返回 Car對象的 方法,好比:public Car createCar();get
可是,Factory類 自己並不知道用戶須要哪一種車,即不知道須要 Car類 的哪一個子類的實例,所以須要將 createCae()方法 設置爲 抽象方法,天然而然的 Factory類 也要爲抽象類,這樣咱們就可讓其子類重寫 createCar()方法,分別返回 Porsche類 和 QQCar類 的實例。因而,當用戶須要 porsche類 的實例時,就沒必要使用 new運算符 和 Porsche類 的構造方法來建立對象,可使用 Factory1類 建立一個對象,讓該對象調用 createCar()方法 就能夠爲用戶得到一個 Porsche類 的實例。產品
當系統準備爲用戶提供某個類的子類實例,又不想讓用戶代碼和該子類造成耦合時,就可使用該工廠方法模式來設計。class
工廠方法模式的關鍵是 在一個接口或抽象類中定義一個 抽象方法,該方法返回某個類的子類的實例,該抽象類或接口 讓其 子類或實現該接口 的類 經過重寫這個抽象方法 返回某個子類的實例。構造函數
三,代碼與類圖
上述例子的代碼:
package MM; abstract class Car { abstract public String getName(); abstract public void buyCar(); } class Porsche extends Car { public String getName() { return "porsche"; } public void buyCar() { System.out.printf("君 可 願 嘗 試 一 下 單 手 開 " + getName() + "!\n"); } } class QQCar extends Car { public String getName() { return "QQcar"; } public void buyCar() { System.out.printf("君 可 願 嘗 試 一 下 單 手 開 " + getName() + "!\n"); } } abstract class Factory { /* 每一個 子類構造方法的第一條語句都是隱含地調用 super() 原本來講,若是在這個類中調用 Factory(),那麼 createCar().getName() 就會出錯, 可是抽象類是沒法定義抽象類對象的,也就是說 new Factory() 這一句是不會出現的 因此,這個構造函數只會被子類調用,屆時,createCar() 就被重載了,createCar().getName() 就正確了 */ public Factory() { System.out.printf("咱們生產了一輛 " + createCar().getName() + ".\n"); } abstract public Car createCar(); } class Factory1 extends Factory { public Car createCar() { return new Porsche(); } } class Factory2 extends Factory { public Car createCar() { return new QQCar(); } } public class M { public static void main(String args[]) { Car c; Factory f; f = new Factory1(); c = f.createCar(); c.buyCar(); f = new Factory2(); c = f.createCar(); c.buyCar(); } }
類圖:
(注: 因爲找不到合適的箭頭,這箭頭就畫的不標準了)
四,工廠方法模式的結構
① 抽象產品(Product): Car類
② 具體產品(ConcreteProduct): Porsche類 和 QQCar類
③ 構造者(Creator): Factory類
④ 具體構造者(ConcreteCreator): Factory1類 和 Factory2類
============ =========== ========= ========= ========= ====== ===== === == =
思帝鄉·春日遊 唐代: 韋莊
春日遊,杏花吹滿頭。陌上誰家年少,足風流?妾擬將身嫁與,一輩子休。縱被無情棄,不能羞。