一、
工廠方法(
factory method
)模式
工廠方法(
factorymethod
)模式是類的建立模式,其用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。
在工廠方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪乙個產品類被例項化這種細節。這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。 在
factory method
模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。 二、
factory method
模式角色與結構:
抽象工廠(
creator
)角色:
是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。
具體工廠(
concrete creator
)角色:
這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:
bulbcreator
與tubecreator。
抽象產品(
product
)角色:
工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是
light。
具體產品(
concrete product
)角色:
這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。 三、
程式舉例:
using
system;
public
abstract
class
light
public
class
bulblight : light
public
override
void
turnoff()
}public
class
tubelight : light
public
override
void
turnoff()
}public
abstract
class
creator
public
class
bulbcreator : creator
}public
class
tubecreator : creator
}public
class
client
}工廠方法的活動序列圖
活動過程包括:
客戶端建立
bulbcreator
物件,客戶端持有此物件的型別是
creator
,而實際型別是
bulbcreator
。然後客戶端呼叫
bulbcreator
的factory
方法,之後
bulbcreator
呼叫bulblight
的建構函式創造出產品
bulblight
物件。
四、
工廠方法模式與簡單工廠模式
工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。
工廠方法模式之所以有乙個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。
當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了
"開放-封閉
"原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。
工廠方法模式退化後可以演變成簡單工廠模式。 五、
factory method
模式演化
使用介面或抽象類
抽象工廠角色和抽象場頻角色都可以選擇由介面或抽象類實現。
使用多個工廠方法
抽象工廠角色可以規定出多於乙個的工廠方法,從而使具體工廠角色實現這些不同的工廠方法,這些方法可以提供不同的商業邏輯,以滿足提供不同的產品物件的任務。
產品的迴圈使用
工廠方法總是呼叫產品類的建構函式以建立乙個新的產品例項,然後將這個例項提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當複雜。
乙個常見的複雜邏輯就是迴圈使用產品物件。工廠物件將已經建立過的產品登記到乙個聚集中,然後根據客戶所請求的產品狀態,向聚集查詢。如果有滿足要求的產品物件,就直接將產品返回客戶端;如果聚集中沒有這樣的產品物件,那麼就建立乙個新的滿足要求的產品物件,然後將這個物件登記到聚集中,再返還給客戶端。
"享元模式(
flyweight pattern)"
就是這樣乙個模式。
多型性的喪失和模式的退化
乙個工廠方法模式的實現依賴於工廠角色和產品角色的多型性。在有些情況下,這個模式可以出現退化。
工廠方法返回的型別應當是抽象型別,而不是具體型別。呼叫工廠方法的客戶端應當依賴抽象產品程式設計,而不是具體產品。如果工廠僅僅返回乙個具體產品物件,便違背了工廠方法的用意,發生退化,這時就不再是工廠模式了。
工廠的等級結構:工廠物件應當有乙個抽象的超型別。如果等級結構中只有乙個具體工廠類的話,抽象工廠就可以省略,發生了退化。 六、
factory method
模式與其它模式的關係
與工廠方法模式有關的模式還包括:
模板方法模式、
mvc模式、享元模式、備忘錄模式 七、
另外乙個例子
// factory method pattern -- real world example
using
system;
using
system.collections;
// "product"
abstract
class
page
// "concreteproduct"
class
skillspage : page
// "concreteproduct"
class
educationpage : page
// "concreteproduct"
class
experiencepage : page
// "concreteproduct"
class
introductionpage : page
// "concreteproduct"
class
resultspage : page
// "concreteproduct"
class
conclusionpage : page
// "concreteproduct"
class
summarypage : page
// "concreteproduct"
class
bibliographypage : page
// "creator"
abstract
class
document
// properties
public
arraylist pages
}// factory method
abstract
public
void
createpages();
}// "concretecreator"
class
resume : document
}// "concretecreator"
class
report : document
}/**/
//////
///class}}
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
設計模式 工廠設計模式
用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...
設計模式 工廠設計模式
工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...