[size=medium] 2 解決方案[/size]
2.1 工廠方法模式來解決
用來解決上述問題的乙個合理的解決方案就是工廠方法模式。那麼什麼是工廠方法模式呢?
(1)工廠方法模式定義
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。
(2)應用工廠方法模式來解決的思路
仔細分析上面的問題,事實上在實現匯出資料的業務功能物件裡面,根本就不知道究竟要使用哪一種匯出檔案的格式,因此這個物件本就不應該和具體的匯出檔案的物件耦合在一起,它只需要面向匯出的檔案物件的介面就好了。
但是這樣一來,又有新的問題產生了:介面是不能直接使用的,需要使用具體的介面實現物件的例項。
這不是自相矛盾嗎?要求面向介面,不讓和具體的實現耦合,但是又需要建立介面的具體實現物件的例項。怎麼解決這個矛盾呢?
工廠方法模式的解決思路很有意思,那就是不解決,採取無為而治的方式:不是需要介面物件嗎,那就定義乙個方法來建立;可是事實上它自己是不知道如何建立這個介面物件的,沒有關係,那就定義成抽象方法就好了,自己實現不了,那就讓子類來實現,這樣這個物件本身就可以只是面向介面程式設計,而無需關心到底如何建立介面物件了。
2.2 模式結構和說明
工廠方法模式的結構如圖3所示:
[img]
圖3 工廠方法模式結構示意圖
product:
定義工廠方法所建立的物件的介面,也就是實際需要使用的物件的介面。
concreteproduct:
具體的product介面的實現物件。
creator:
建立器,宣告工廠方法,工廠方法通常會返回乙個product型別的例項物件,而且多是抽象方法。也可以在creator裡面提供工廠方法的預設實現,讓工廠方法返回乙個預設的product型別的例項物件。
concretecreator:
具體的建立器物件,覆蓋實現creator定義的工廠方法,返回具體的product例項。
2.3 工廠方法模式示例**
(1)先看看product的定義,示例**如下:
/**
* 工廠方法所建立的物件的介面
*/public inte***ce product
(2)再看看具體的product的實現物件,示例**如下:
/**
* 具體的product物件
*/public class concreteproduct implements product
(3)接下來看看建立器的定義,示例**如下:
/**
* 建立器,宣告工廠方法
*/public abstract class creator
}
(4)再看看具體的建立器實現物件,示例**如下:
/*** 具體的建立器實現物件
*/public class concretecreator extends creator
}
2.4 使用工廠方法模式來實現示例
要使用工廠方法模式來實現示例,先來按照工廠方法模式的結構,對應出哪些是被建立的product,哪些是creator。分析要求實現的功能,匯出的檔案物件介面exportfileapi就相當於是product,而用來實現匯出資料的業務功能物件就相當於creator。把product和creator分開過後,就可以分別來實現它們了。
使用工廠模式來實現示例的程式結構如圖4所示:
[img]
圖4 使用工廠模式來實現示例的程式結構示意圖
(1)匯出的檔案物件介面exportfileapi的實現沒有變化,這裡就不去贅述了
/**
* 匯出成文字檔案格式的物件
*/public class exporttxtfile implements exportfileapi
}
再看看匯出成資料庫備份檔案形式的物件的實現,示例**如下:
/*** 匯出成資料庫備份檔案形式的物件
*/public class exportdb implements exportfileapi
}
(3)creator這邊的實現,首先看看exportoperate的實現,示例**如下:
/**
* 實現匯出資料的業務功能物件
*/public abstract class exportoperate
/*** 工廠方法,建立匯出的檔案物件的介面物件
* @return 匯出的檔案物件的介面物件
*/protected abstract exportfileapi factorymethod();
}
/**
* 具體的建立器實現物件,實現建立匯出成文字檔案格式的物件
*/public class exporttxtfileoperate extends exportoperate
}
再看看建立匯出成資料庫備份檔案形式的物件,示例**如下:
/**
* 具體的建立器實現物件,實現建立匯出成資料庫備份檔案形式的物件
*/public class exportdboperate extends exportoperate
}
(5)客戶端直接建立需要使用的creator物件,然後呼叫相應的功能方法,示例**如下:
public class client
}
執行結果如下:
匯出資料測試資料到資料庫備份檔案
匯出資料測試資料到資料庫備份檔案
你還可以修改客戶端new的物件,切換成其它的實現物件,試試看會發生什麼。看來應用工廠方法模式是很簡單的,對吧。
未完待續......
研磨設計模式之工廠方法模式 2
用來解決上述問題的乙個合理的解決方案就是工廠方法模式。那麼什麼是工廠方法模式呢?1 工廠方法模式定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。2 應用工廠方法模式來解決的思路 仔細分析上面的問題,事實上在實現匯出資料的業務功能物...
研磨設計模式之工廠方法模式 5
1 什麼是平行的類層次結構呢?簡單點說,假如有兩個類層次結構,其中乙個類層次中的每個類在另乙個類層次中都有乙個對應的類的結構,就被稱為平行的類層次結構。舉個例子來說,硬碟物件有很多種,如分成台式電腦硬碟和筆記本硬碟,在台式電腦硬碟的具體實現上面,又有希捷 西數等不同品牌的實現,同樣在筆記本硬碟上,也...
研磨設計模式之工廠方法模式 3
1 模式的功能 工廠方法的主要功能是讓父類在不知道具體實現的情況下,完成自身的功能呼叫,而具體的實現延遲到子類來實現。這樣在設計的時候,不用去考慮具體的實現,需要某個物件,把它通過工廠方法返回就好了,在使用這些物件實現功能的時候還是通過介面來操作,這非常類似於ioc di的思想,這個在後面給大家稍詳...