要想正確理解設計模式,首先必須明確它是為了解決什么問題而提出來的。
設計模式學習筆記
——Shulin
轉載請注明出處:http://blog.csdn.net/zhshulin
工廠模式定義:實例化對象,用工廠方法代替new操作。達到解耦的目的(避免硬編碼耦合)。工廠方法模式是類的創建模式,又叫做虛擬構造子(Virtual Constructor)模式或者多態性工廠(Polymorphic Factory)模式。
工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在java程序系統可以說是隨處可見。因為工廠模式就相當于創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴展性和盡量少的修改量。
常用的java ee框架:sPRing,Spring容器就是一個巨大的工廠。
解耦,使程序的擴展性更強。
比如現在有2個工作AWork和BWork,以后可能更多。如果此時我們使用簡單工廠方法,那么我們會設計一個WorkFactory然后實現一個靜態方法,通過參數來控制生成哪個工作。看似簡單工廠也能完成任務,但是如果以后需要加上CWork,那么需要添加CWork實現類以及修改工廠方法,如果更多,那么會導致工廠類過于臃腫。因為簡單工廠模式只有一個工廠類,它需要處理所有的創建的邏輯。
這時候就需要工廠方法模式來處理以上需求。在工廠方法模式中,核心的工廠類不再負責所有的對象的創建,而是將具體創建的工作交給子類去做。這個核心類則搖身一變,成為了一個抽象工廠角色,僅負責給出具體工廠子類必須實現的接口,而不接觸哪一個類應當被實例化這種細節。
這種進一步抽象化的結果,使這種工廠方法模式可以用來允許系統在不修改具體工廠角色的情況下引進新的產品,這一特點無疑使得工廠方法模式具有超過簡單工廠模式的優越性。下面就針對以上需求設計UML圖:
從上圖可以看出,這個使用的工廠方法模式的系統涉及到以下角色:
抽象工廠(IWorkFactory)角色:擔任這個角色的是工廠方法模式的核心,任何在模式中創建對象的工廠類必須實現這個接口。在實際的系統中,這個角色也常常使用抽象類實現。
具體工廠(AWorkFactory、BWorkFactory)角色:擔任這個角色的是實現了抽象工廠接口的具體JAVA類。具體工廠角色含有與業務密切相關的邏輯,并且受到使用者的調用以創建工作類。
抽象工作(IWork)角色:工廠方法模式所創建的對象的超類,也就是所有工作類的共同父類或共同擁有的接口。在實際的系統中,這個角色也常常使用抽象類實現。
具體工作(AWork和BWork)角色:這個角色實現了抽象(ExportFile)角色所聲明的接口,工廠方法模式所創建的每一個對象都是某個具體工作角色的實例。
抽象工作類:
[java] view plain copy print?public interface IWork { public void doWork(); } 具體工作類:[java] view plain copy print?public class AWork implements IWork { @Override public void doWork() { System.out.println("做的是A工作!"); } } [java] view plain copy print?public class BWork implements IWork { @Override public void doWork() { System.out.println("做的是B工作!"); } } 抽象工廠:[java] view plain copy print?public interface IWorkFactory { public IWork createWork(); } 具體工廠:[java] view plain copy print?public class AWorkFactory implements IWorkFactory { @Override public IWork createWork() { return new AWork(); } } [java] view plain copy print?public class BWorkFactory implements IWorkFactory { @Override public IWork createWork() { return new BWork(); } }客戶端角色類源代碼:
[java] view plain copy print?public class Test { public static void main(String[] args) { IWorkFactory aWorkFactory = new AWorkFactory(); IWork aWork = aWorkFactory.createWork(); aWork.doWork(); IWorkFactory bWorkFactory = new BWorkFactory(); IWork bWork = bWorkFactory.createWork(); bWork.doWork(); } }工廠方法模式和簡單工廠模式在結構上的不同很明顯。工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式退化后可以變得很像簡單工廠模式。設想如果非常確定一個系統只需要一個具體工廠類,那么不妨把抽象工廠類合并到具體工廠類中去。由于只有一個具體工廠類,所以不妨將工廠方法改為靜態方法,這時候就得到了簡單工廠模式。
如果系統需要加入一個新的工作CWork,那么所需要的就是向系統中加入一個這個導類以及所對應的工廠類。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或者其他已有的具體工廠角色。對于增加新的導出類型而言,這個系統完全支持“開-閉原則”。
(原文地址:http://blog.csdn.net/zhshulin/article/details/38339085)新聞熱點
疑難解答