抽象工廠模式的實踐

2021-06-12 06:31:23 字數 2080 閱讀 8477

抽象工廠模式,簡單地說,由幾個類構成:乙個工廠類,乙個或多個抽象類作為基類,多個具體類作為子類,還有乙個介面。工廠類有乙個工廠方法,它接收乙個引數,例如要建立物件的資訊;返回乙個實現了那個介面的物件。該物件的執行時型別則是上述子類中的乙個。這些子類中的每乙個都繼承於那些基類中的乙個,那些基類再分別向上繼承到乙個共同的基類,它是繼承關係的根。根類會實現那個介面。

以cat和dog兩個類為例,它們可以繼承於pet類,並實現介面imypet,然後,工廠類petfactory的createpet方法能這樣工作:createpet("kittie") 返回乙個新建立的cat物件,而createpet("woofy") 返回乙個dog物件。它可以是根據資料庫裡有kittie和woofy的記錄而去建立這些不同種類的物件的。

現在,我想讓這個建立出來的寵物去喝牛奶。不過,為了考驗它們,在它們的必經之路上有乙個游泳池。貓不會游泳,我特意為它準備了乙個竹筏(嗯,我相信她能自己學會怎樣使用它)。然後,我分別呼叫每個寵物的gotodrinkmilk()方法。該方法類似下面這樣:

// in class pet

public void gotodrinkmilk()

這個方法實現在基類pet中,目的是把一些固定的步驟放在乙個共享的方法裡。這也就是模板方法。它裡面呼叫的四個方法只要有必要就可以在子類中重寫。我看,至少passswimmingpool是需要在子類中重寫的,這樣能讓貓和狗以不同的方式通過游泳池。

// in class pet

// override this in a child class

public abstract void passswimmingpool();

// in class cat

public override void passswimmingpool()

// in class dog

public override void passswimmingpool()

有了這些實現之後,小動物們就能歡快地喝牛奶了。請注意,我們這裡用了乙個模板方法,也就是gotodrinkmilk()。如果要讓某些其他操作能被共享,我們可以把更多的方法放在基類中實現。事實上,passswimmingpool中呼叫的每個方法,只要有必要,都可以在基類中實現。這樣的話,狗狗也能用竹筏了。甚至,可以把cat類的passswimmingpool裡的內容抽出來,放到基類中的乙個叫passswimmingpoolbyboat的方法中,這樣如果再有另一種特殊型別的貓,它在其他方面與cat不同,但過游泳池的行為卻一樣,那麼它也可以使用這個方法了。

前面講了哪些方法可以作為模板方法放在基類中並多型地呼叫子類方法,也講了怎樣把一些方法的內容「下推」到基類中以便讓多個子類能夠共享,現在講講工廠方法的簡單實現。

最簡單的例子就是物件的資料是儲存在資料庫中的。比如有下表:

列名型別

注釋petid

guid

寵物的id

petname

varchar

寵物的名字

pettype

varchar

寵物的型別碼,如cat、dog等

......

有關寵物的其他資訊

對於這個表,如果有兩條記錄,其中一條的petname是kittie,pettype是cat;另一條的petname是woofy,pettype是dog,那麼當呼叫createpet("kittie")時,它會去查詢petname為kittie的那條記錄,然後檢查pettype值,發現是cat後,就建立乙個cat類的物件,並用資料庫中的資料去初始化它。基本的工作方式就是這樣。

需要注意的是,由於潛在地有些方法需要被「下推」到基類中,基類最好能包含絕大多數它可能用到的資料成員,包括那些在只有在特定的子類中才有的行為。因為這些行為可能被多個子類共享而需要被「下推」到基類中,所以這些行為中要用到的資料成員最好也放在基類中作為受保護(protected)成員來處理。這樣會讓程式修改的代價更低一些。

本文講述了程式設計實踐中對抽象工廠設計模式的一些常見用法,包括基類與子類、介面、工廠方法及注意事項等。有了這些了解之後,您在將來的實踐中或許能更容易地對這種場合進行程式設計。歡迎在r_mosaic的csdn部落格上提出您的意見和想法。

抽象工廠實踐

前面我們介紹了簡單工廠,知道了可以通過簡單工廠來獲得想要的單個產品。那如果我們想要獲的是一系列或者相互依賴物件的物件呢?這個時候就需要乙個功能更加強大的工廠 抽象工廠。還是通過例子來做說明,這個例子是乙個客戶請求工程師幫忙組裝電腦。同時為了突出學習重點,這個電腦只有cpu 和 主機板。主要是用來學習...

抽象工廠模式 抽象工廠模式

抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...

工廠模式 抽象工廠模式

這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...