1. 程式人生 > >趣味設計模式之抽象工廠模式

趣味設計模式之抽象工廠模式

    上篇博文我簡介的介紹了下工廠模式,不知道是不是幫助到了部分人,下面我們再來探討下抽象工廠模式。

    某一天,唐三藏一行人西行的路上遇到了一個強大無比的妖怪,唐僧被抓走了,光靠悟空他們沒有辦法把唐僧救回來,這個時候就需要找救兵了。悟空他們第一時間想到的就是天庭,但是奈何現在沒有這個工廠啊,怎麼辦?所以得按照原來的套路,再建多一個第三方工廠來解決第三方幫手的問題。還是先從圖瞭解下先:

(1)工廠模式時候的圖(上一篇博文)

 (2)現在我們需要增加一個第三方工廠

現在我們就有兩個工廠了,遇到妖怪時,那一個打的過,我們就用哪個,實在不行就一起上,畢竟團結就是力量嗎。哈哈哈!!

然後我們通過程式碼來看下:

(1)第一步:仍舊是上一篇的幫手:


 * 幫手的介面
 * */
public interface Bangshou {
	
	/**
	 * 用來說明是誰
	 * */
	void whoAmI();

}
public class WuKong implements Bangshou{

	@Override
	public void whoAmI() {
		System.out.println("我是齊天大聖孫悟空!");
		
	}

}

(2)第二步:第三方幫手

public interface Thirdbangshou {
	
	void whoHelper();

}
public class Erlangshen implements Thirdbangshou{

	@Override
	public void whoHelper() {
		System.out.println("我是二郎神!來參戰");
		
	}

}

(3)第三步:第三步,定義一個工廠,這個工廠不僅僅可以生產幫手,還可以生成第三方幫手(抽象)

public abstract class AbstractHelperFactory {
	
	public abstract Bangshou getBanshou(String who);
	
	public abstract Thirdbangshou getThirdbangshou(String who);

}

(4)第四步,實現這個工廠,推遲到它的子類實現,第一個僅僅是實現幫手的

 

public class NewBangshouFactory extends AbstractHelperFactory{

	@Override
	public Bangshou getBanshou(String who) {
		if(who == null) return null;
		if("WUKONG".equalsIgnoreCase(who)) {
			return new WuKong();
		}
		if("BAJIE".equalsIgnoreCase(who)) {
			return new Bajie();
		}
		if("BAILONGMA".equalsIgnoreCase(who)) {
			return new Bailongma();
		}
		if("SHASENG".equalsIgnoreCase(who)) {
			return new Shaseng();
		}
		return null;
	}

	@Override
	public Thirdbangshou getThirdbangshou(String who) {
		return null;
	}

}

(5)實現第三方幫手介面

public class ThirdbangshouFactory extends AbstractHelperFactory{

	@Override
	public Bangshou getBanshou(String who) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Thirdbangshou getThirdbangshou(String who) {
		
		if(who == null) return null;
		if("ERLANGSHEN".equalsIgnoreCase(who)) {
			return new Erlangshen();
		}
		if("TAISHANGLAOJUN".equalsIgnoreCase(who)) {
			return new Taishanglaojun();
		}
		return null;
	}

}

(5)第五步,工廠已經建好,然後就是生產了,因為前面我們說到,用到什麼幫手就產生什麼工廠,然後產生

public class HelperFactory {
	
	public static AbstractHelperFactory getAbstractHelperFactory(String type) {
		if("help".equalsIgnoreCase(type)) {
			return new NewBangshouFactory();
		}
		if("third".equalsIgnoreCase(type)) {
			return new ThirdbangshouFactory();
		}
		return null;
	}
}

 (6)第六步,測試

public class TestAbstract {
	
	public static void main(String[] args) {
		/**
		 * 第一步,我要試試悟空他們能打得過不,拿到生產悟空的工廠
		 * */
		AbstractHelperFactory a1 = HelperFactory.getAbstractHelperFactory("help");
	
		/**
		 * 第二步,我要石猴
		 * */
		Bangshou b = a1.getBanshou("WUKONG");
		
		/**
		 * 打架去吧
		 * */
		b.whoAmI();
		
		/**
		 * 打不過,請求支援,需要用到第三方工廠
		 * */
		AbstractHelperFactory a2 = HelperFactory.getAbstractHelperFactory("third");
		
		/**
		 * 我要二郎神
		 * */
		Thirdbangshou t = a2.getThirdbangshou("erlangshen");
		
		/**
		 * 二郎神出戰
		 * */
		t.whoHelper();
	}

}

 (7)效果圖

    抽象工廠模式,本質就是不同的工廠生產不同的產品,然後我們需要用產品的時候,就選擇哪個工廠生產哪種產品。