《Design Patterns》SimpleFactory.積跬步系列

SimpleFactory:簡單工廠模式

先代碼

父類或接口類:

package h.l.demo.simplefactory;
/**
 * 
 * @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.l.demo.simplefactory;
/**
 * 
 * @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.l.demo.simplefactory;
/**
 * 
 * @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.l.demo.simplefactory;

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 工廠類
 */
public class SimpleFactory {
	/**
	 * 通過工廠獲取實例
	 * @param subType 子類型
	 * @return
	 */
	public static SuperClassOrInterface getInstance(String subType) {
		SuperClassOrInterface si = null;
		switch (subType) {
		case "SubClassOrImplClass1":
			si = new SubClassOrImplClass1();
			break;
		case "SubClassOrImplClass2":
			si = new SubClassOrImplClass2();
			break;
		}
		return si;
	}
}

測試類:

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

	public static void main(String[] args) {
		SuperClassOrInterface si = SimpleFactory.getInstance("SubClassOrImplClass1");
		si.doSomeThings();
		// si.doThings();
		System.out.println("-----------------------");
		si = SimpleFactory.getInstance("SubClassOrImplClass2");
		si.doSomeThings();
		// si.doThings();
	}

}

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

後分析

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

簡單工廠模式,聯繫生活實際,可以類比於現實中的大米加工廠。這個加工廠收來自各個村莊的大米,甲村莊的大米是圓顆粒香糯型的,乙村莊的大米是長顆粒爽口型的,丙村莊的大米是低糖乾癟型的,丁村莊的大米則是圓潤飽滿型的。現實生活中是,大家會去加工廠挑選我們自己想要喫的哪種大米,很少有人會直接去個村莊農民伯伯家買大米吧。大夥都是直接向加工廠提要求:我要長顆粒爽口型的大米,那加工廠就會把乙村莊的大米賣給你;我血糖有些偏高,我需要低糖乾癟型的大米,那加工廠就會把丙村莊的大米提供給你。這個過程有沒有發現,我們所買到的大米,實際上完全不關心他來自哪裏。我們只需要向加工廠提要求就可以,至於我們要的大米來自哪裏,這個由加工廠去找去負責。
實際上,簡單工廠模式就是這個道理。我們可以將n個類的公共方法或者行爲抽取出來作爲父類的抽象方法或接口,由子類對抽象方法或接口進行實現。對於不同子類的創建,我們不在是new一個子類對象,而是將new的過程全權交由工廠去操作。被實例化類則對調用者屏蔽。

其他例子:參考自《大話設計模式》
如寫一個計算器加減乘除,實際上都是對兩個操作數據進行操作然後得出結論。更爲準確的說,加減乘除都是對操作數據的操作行爲。那麼這個行爲就應該被定義在接口中,由各個操作類中進行實現。因爲子類很多,爲了對調用者友好(不希望調用者要很辛苦的去記得調用加法方法得去new加運算的類,減法由去new一個減運算的類),我們通過工廠給了一個統一的入口,調用者將運算符傳入,我們給他返回對應的運算類即可。好處嘛:挺明顯,比new A();new B();new 啊不次的();方便多了吧。可千萬別說不就個加減乘除嘛,我全寫在main方法中,一個方法搞定,那我不敢出聲了,自個加油。


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

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