當代嗎使用具體類時,一旦加入新的具體類,就必須要改變**(import該類)。我們希望在生成物件的時候,不使用new+具體類的名稱,而是希望呼叫乙個簡單的方法,傳遞乙個引數過去,就可以返回乙個具體的物件。通過這種方法,我們減少了我們對其他**的類的名稱的依賴。
簡單例子的類圖如下
如圖所示,相比於原來,如果要提供四種pizza物件,使用者需要知道內部四個類的名稱進行建立,如果類的名稱修改,客戶的程式將無法執行正常。而採取簡單工廠模式的耦合只有乙個方法。
又稱之為虛擬構造器,父類負責定義建立類的公共介面,子類負責生成具體物件。
以上述例子為例,製作pizza物件只有simplypizzafactory負責。但是如果要實現製作pizza物件的的不同流程,就需要新增工廠。
假設使用者在上面的例子中需要新加物件的產生流程,在不修改源**的情況下,可以在原來的**中新增新的工廠。這便是工廠方法模式。
注意,使用者如果想要生成pizza物件,需要先生成工廠物件,再按照工廠物件所遵循的抽象介面生成pizza物件。所以耦合度為工廠的類的名稱和工廠所遵循的抽象介面。
如果在工廠模式下,需要新增一種新的抽象產品,比如說除了pizza還要售賣hotdog,工廠方法仍然避免如果完全新增一種抽象產品的修改。所以採用抽象工廠法
繼承於同乙個抽象產品的被稱之為產品等級結構,由同乙個抽象工廠生產的產品被稱之為產品族。如果每個產品族只有乙個產品,則退回到工廠方法
防範在構造物件過程中this引用從本執行緒中逸出。
不要在建構函式中將被物件的this的引用顯示或者隱式的洩露出去(就是保證在構造完成保證this物件不被非構造執行緒可見)
public
class
thisescape})
; name =
"flysqrlboy";}
}
上述**應該更改為工廠方法
public
class
thissafe};
name =
"flysqrlboy";}
//採取工廠方法
public
static thissafe getinstance
(eventsource
source)
}
另外,基於同樣的原因,我們不能在建構函式中啟動執行緒,所以,我們需要工廠方法來啟動執行緒。 設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
設計模式 工廠設計模式
用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...
設計模式 工廠設計模式
工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...