《Design Patterns》FactoryMethod.積跬步系列

FactoryMethod:工廠方法模式

先代碼

父類或接口類:

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: Demo--簡單工廠模式
 * SuperClassOrInterface:表示父類或者接口都行,此處兩者代碼都會給出,大同小異
 */
/*public abstract class SuperClassOrInterface {
	// 抽象方法
	public abstract void doSomeThings();
	// 非抽象方法
	public void doThings(){
		System.out.println("SuperClassOrInterface:doThings...");
	}
}*/
public interface SuperClassOrInterface{
	public void doSomeThings();
}

子類或實現類(兩個):

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子類1:繼承或實現
 */
/*public class SubClassOrImplClass1 extends SuperClassOrInterface {

	*//**
	 * 實現抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
	*//**
	 * 子類重寫父類方法
	 * @Override 可以校驗該方法是不是在父類(超類)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass1:doThings...");
	}
}*/
public class SubClassOrImplClass1 implements SuperClassOrInterface {

	/**
	 * 實現接口中指定的行爲
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
}
package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子類2:繼承或實現
 */
/*public class SubClassOrImplClass2 extends SuperClassOrInterface {
	*//**
	 * 實現抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
	*//**
	 * 子類重寫父類方法
	 * @Override 可以校驗該方法是不是在父類(超類)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass2:doThings...");
	}
}*/
public class SubClassOrImplClass2 implements SuperClassOrInterface {

	/**
	 * 實現接口中指定的行爲
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
}

抽象工廠或接口工廠:

package h.ldemo.factorymethod;

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月15日
 * @Description: 抽象工廠或接口工廠
 */
public abstract class SuperFactoryOrFactoryInterface {
	// 此處以抽象類爲例,接口方式類似
	// 獲取實例
	public abstract SuperClassOrInterface getInstance();
}

抽象工廠或接口工廠子類(舉例兩個):

package h.ldemo.factorymethod;

public class SubFactoryOrFactoryImpl1 extends SuperFactoryOrFactoryInterface {

	@Override
	public SuperClassOrInterface getInstance() {
		// TODO Auto-generated method stub
		System.out.println("具體工廠1實例化-->具體對象1...");
		return new SubClassOrImplClass1();
	}

}
package h.ldemo.factorymethod;

public class SubFactoryOrFactoryImpl2 extends SuperFactoryOrFactoryInterface {

	@Override
	public SuperClassOrInterface getInstance() {
		// TODO Auto-generated method stub
		System.out.println("具體工廠2實例化-->具體對象2...");
		return new SubClassOrImplClass2();
	}

}

測試類:

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 測試
 */
public class TestMainEnter {

	public static void main(String[] args) {
		SuperFactoryOrFactoryInterface superFactory = new SubFactoryOrFactoryImpl1();
		superFactory.getInstance().doSomeThings();
		System.out.println("---------------------");
		superFactory = new SubFactoryOrFactoryImpl2();
		superFactory.getInstance().doSomeThings();
	}

}

測試結果:
在這裏插入圖片描述

後分析

  • 個人建議:寫代碼是件幸福的事,So,do it

工廠方法模式,定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
簡單工廠VS工廠方法:
簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。如簡單工廠模式博客中講的計算機的例子,你完成了加減乘除,但你需要計算次方的時候,你還需要對工廠進行修改,添加對應的case,這可不是一個好辦法,就等於說,他們不但對擴展開放了,對修改也開放了,這個就違背了開放-封閉原則。那麼工廠模式就發揮作用了。如上述代碼所寫的,我們每添加一個新的功能,只需要增加具體類和相應的工廠類即可,這就滿足了開閉原則。
總結:工廠方法模式克服了簡單工廠模式違背的開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。使得更換對象時,不需要做太大的改動就可以實現,降低了客戶程序與產品對象的耦合。可以說,工廠方法是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。但工廠方法模式本身也存在瑕疵,由於每增加一個產品,就要添加一個產品工廠類,增加了額外的開發量。

其他例子:參考自《大話設計模式》雷鋒工廠


注:以上文章僅是個人總結,若有不當之處,望不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章