1. 程式人生 > >設計模式學習之工廠模式(Factory)

設計模式學習之工廠模式(Factory)

轉自:https://blog.csdn.net/u012909091/article/details/38339085

要想正確理解設計模式,首先必須明確它是為了解決什麼問題而提出來的。

——Shulin

1、概念

           工廠模式定義:例項化物件,用工廠方法代替new操作。達到解耦的目的(避免硬編碼耦合)。工廠方法模式是類的建立模式,又叫做虛擬構造子(Virtual Constructor)模式或者多型性工廠(Polymorphic Factory

)模式。


        工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程式系統可以說是隨處可見。因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A() 工廠模式也是用來建立例項物件的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量


       常用的java ee

框架:SpringSpring容器就是一個巨大的工廠


2、目的

       解耦,使程式的擴充套件性更強。


3、舉例說明


        比如現在有2個工作AWorkBWork,以後可能更多。如果此時我們使用簡單工廠方法,那麼我們會設計一個WorkFactory然後實現一個靜態方法,通過引數來控制生成哪個工作。看似簡單工廠也能完成任務,但是如果以後需要加上CWork,那麼需要新增CWork實現類以及修改工廠方法,如果更多,那麼會導致工廠類過於臃腫。因為簡單工廠模式只有一個工廠類,它需要處理所有的建立的邏輯。

 

        這時候就需要工廠方法模式來處理以上需求。在工廠方法模式中,核心的工廠類不再負責所有的物件的建立,而是將具體建立的工作交給子類去做。這個核心類則搖身一變,成為了一個抽象工廠角色,僅負責給出具體工廠子類必須實現的介面,而不接觸哪一個類應當被例項化這種細節。

 

        這種進一步抽象化的結果,使這種工廠方法模式可以用來允許系統在不修改具體工廠角色的情況下引進新的產品,這一特點無疑使得工廠方法模式具有超過簡單工廠模式的優越性。下面就針對以上需求設計UML圖:




從上圖可以看出,這個使用的工廠方法模式的系統涉及到以下角色:

 

  抽象工廠(IWorkFactory)角色:擔任這個角色的是工廠方法模式的核心,任何在模式中建立物件的工廠類必須實現這個介面。在實際的系統中,這個角色也常常使用抽象類實現。

 

  具體工廠(AWorkFactoryBWorkFactory)角色:擔任這個角色的是實現了抽象工廠介面的具體JAVA類。具體工廠角色含有與業務密切相關的邏輯,並且受到使用者的呼叫以建立工作類。

 

  抽象工作(IWork)角色:工廠方法模式所建立的物件的超類,也就是所有工作類的共同父類或共同擁有的介面。在實際的系統中,這個角色也常常使用抽象類實現。

 

  具體工作(AWorkBWork)角色:這個角色實現了抽象(ExportFile)角色所宣告的介面,工廠方法模式所建立的每一個物件都是某個具體工作角色的例項。


4、原始碼


抽象工作類:

public interface IWork {
	public void doWork();
}


具體工作類:

public class AWork implements IWork {
	@Override
	public void doWork() {
		System.out.println("做的是A工作!");
	}
}
public class BWork implements IWork {
	@Override
	public void doWork() {
		System.out.println("做的是B工作!");
	}
}


抽象工廠:

public interface IWorkFactory {
	public IWork createWork();
}


具體工廠:

public class AWorkFactory implements IWorkFactory {
 
	@Override
	public IWork createWork() {
		return new AWork();
	}
 
}
public class BWorkFactory implements IWorkFactory {
 
	@Override
	public IWork createWork() {
		return new BWork();
	}
 
}

客戶端角色類原始碼:

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();
	}
 
}


5、工廠模式和簡單工廠模式

          工廠方法模式和簡單工廠模式在結構上的不同很明顯。工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上


  工廠方法模式退化後可以變得很像簡單工廠模式。設想如果非常確定一個系統只需要一個具體工廠類,那麼不妨把抽象工廠類合併到具體工廠類中去。由於只有一個具體工廠類,所以不妨將工廠方法改為靜態方法,這時候就得到了簡單工廠模式。

 

  如果系統需要加入一個新的工作CWork,那麼所需要的就是向系統中加入一個這個導類以及所對應的工廠類。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或者其他已有的具體工廠角色。對於增加新的匯出型別而言,這個系統完全支援“開-閉原則”。