設計模式之工廠方法模式

anticipate 預料 = except
ant螞蟻 ic ic卡 ip ip卡 ate吃
我沒有預料到小螞蟻把我的ic,ip卡吃掉了。
robust 強壯的 = strong
ro rong容祖兒  bu不  st石頭
容祖兒不喜歡強壯的石頭。
maintain 維持 = keep
main主要的(大陸)  tain 臺灣
大陸和臺灣維持着若即若離的關係。
設計模式之工廠方法模式

動機:
    一個工廠方法factory method定義了一個接口來創建對象,但是讓子類去選擇創建哪一個,在運行時創建。一個關於factory method的簡單生活例子就是賓館。進入酒店首先你要登記,前臺會在你付錢後給你房間的鑰匙,這種方式你可以看做room factory。當你待在賓館,你肯能需要打電話,你叫前臺,前臺幫你撥打你要打的號碼,就是phone-call factory,因爲前臺控制着電話的訪問。
目的:        定義一個接口來創建對象,但是讓子類去決定實例化哪一個種。
實現:
上圖的類:--Product:                    定義了factory method創建的對象接口
--Concrete Product:    實現Product接口
--Creator :                   聲明factory method方法,返回一個Product類,可能調用抽象mehtod來創建                                Product對象
--Concrete Creator:      重寫抽象方法來創想具體的Product類
public interface Product {  }
public abstract class Creator 
{
    public void anOperation() 
    {
        Product product = factoryMethod();
    }
    protected abstract Product factoryMethod();
}
public class ConcreteProduct implements Product {  }
public class ConcreteCreator extends Creator 
{
    protected Product factoryMethod() 
    {
        return new ConcreteProduct();
    }
}
public class Client 
{
    public static void main( String arg[] ) 
    {
        Creator creator = new ConcreteCreator();
        creator.anOperation();
    }
}
應用舉例:        實現工廠方法factory method的需求是頻繁的,如下情況:當一個類不知道它要創建的類型。當一個類想要子類去詳細說明一個新的類型。
Example 1:
        考慮一個桌面應用。很多地方要用到文檔。一個桌面應用包括一些操作,例如:打開,創建,保存文檔。基本類用來抽象,命名應用和文檔。客戶端不得不使用它們去創建子類來定義它們自己的應用和文檔。比如生成一個繪畫應用,需要定義繪畫應用drawingApplication和繪畫文檔drawingDocument類,這些應用類的任務是管理文檔類,從客戶端接收請求去處理(比如從菜單中接收打開或者保存命令)。
        由於文檔類需要被應用類實例化,應用類不知道文檔的類型,但是它知道什麼時候去實例化。這個框架需要去實例化具體的文檔類,但是它僅僅知道不能實例化的抽象類。
        Factory method模式通過把所有的信息給需要實例化文檔類對象,在框架外部使用文檔類對象的類,正如下面我們看到的:
        在這個application class應用類,CreateDocument方法或者有一個默認的實現,或者不實現,讓子類MyApplication去創造一個MyDocument
public Document CreateDocument(String type){
    if (type.isEqual("html"))
        return new HtmlDocument();
    if (type.isEqual("proprietary"))
        return new MyDocument();
    if (type.isEqual("pdf"))
        return new PdfDocument ();
}
CreateDocument()方法將會被MyApplication繼承,所以它會實例化一個MyDocument對象。我們稱CreateDocument()爲Factory method工廠方法,因爲它負責去創建一個對象。通過這個方法去重新定義一個Appliction的子類,從這一點來看Factory method模式,這個模式符合依賴反轉選擇。
問題及解決方案:使用Factory method模式有一些問題:
定義Creator class
        如果我們在已經寫好的代碼上去應用Factory method模式,可能有兩種情況:
1、Creator類是抽象的,generating方法沒有任何實現,這種情況,ConcreteCreator具體的creator類必須重定義。
2、Creator類是具體的,generating方法有一個默認的實現,如果是這樣,ConcreteCreator將使用默認的實現,而不是繼承。
    Factory method只是工廠模式的一個特殊例子,在現代編程語言裏面,使用註冊器registration的工廠模式使用的更多。
壞處和好處:好處:
1、分割應用和類,在應用中用弱連接代替強連接,這樣可以簡單的方法和最小的改變去擴展Product
2、提供個性化的鉤子,當一個對象直接在類裏面被創建,很難被繼承它的對象去代替。使用工廠模式就很輕易的代替原始的對象。
壞處:工廠模式被具有family特性,可繼承的類使用,如果類沒有相同的基礎類或繼承,就不能使用工廠模式。
熱點:        工廠模式是廣泛使用的模式,也是更強壯的設計模式之一,當你使用factory method的時候,有一些地方需要考慮:
        考慮你確實需要工廠模式去創建對象。也許使用工廠模式會帶來沒必要的複雜。不管怎樣,如果你有很多類有共同的基本類型,並且你把他們當做抽象類來操作,你需要使用工廠模式。如果你有很多如下的代碼,好好考慮他們:
if (genericProduct typeof ConcreteProduct)
    ((ConcreteProduct)genericProduct).doSomeConcreteOperation();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章