考慮一個問題。我們現(xiàn)在需要一個類的實(shí)例來協(xié)助我們完成某項(xiàng)功能。這在面向?qū)ο蟮拈_發(fā)過程中是常見的。在使用這個類的實(shí)例的時候,我們還需要對他進(jìn)行一些初始化的工作。另外,為了保證我們的代碼具有一定的擴(kuò)展性,我們不想關(guān)心這個類的具體細(xì)節(jié),并且希望在將來問題發(fā)生變化的時候,我們可以不改變我們的代碼就可以改變這個類的行為。 現(xiàn)在問題在于,初始化工作同這個類的具體細(xì)節(jié)密切相關(guān)。類的行為不同,初始化的工作也不同。但是這個類本身只是提供一些輔助性的工作,在它的內(nèi)部,也同樣不關(guān)心外部調(diào)用環(huán)境,也就是我們的代碼中的細(xì)節(jié)。這樣就產(chǎn)生了矛盾:不知道這個類的細(xì)節(jié),我們不能做初始化工作,這個類本身不能做初始化工作。我們?yōu)榱藬U(kuò)展性不想知道類的細(xì)節(jié)。 為了解決這個矛盾,就可以使用設(shè)計(jì)模式中的工廠方法。 這個方法在設(shè)計(jì)模式這本書中是這樣定義的:定義一個用于創(chuàng)建對象的接口,讓子類決定將那個類實(shí)例化。 這樣,對于上述矛盾,我們可以做這樣的設(shè)計(jì): 我們需要的協(xié)助類叫做Product 定義一個類Factory。他有一個方法叫做CreateProduct(),這個方法返回一個Product類的實(shí)例。這個方法是Overridable 的,以便子類覆蓋。 假設(shè)我們的客戶端代碼是ClientFun()方法,他有一個參數(shù),類型為Factory:ClientFun(f as Factory) 我們可以把初始化工作放在CreateProduct方法中。 ClientFun()代碼中,在需要Product類實(shí)例的時候,調(diào)用f.CreateProduct()方法,獲得Product類的實(shí)例。 在需要新的Pruduct實(shí)例的時候,我們可以創(chuàng)建一個Factory的子類,在這個子類中覆蓋CreateProduct方法,返回一個新的Product實(shí)例,并進(jìn)行新的初始化工作。
|