趣味設計模式之抽象工廠模式
阿新 • • 發佈:2018-11-23
上篇博文我簡介的介紹了下工廠模式,不知道是不是幫助到了部分人,下面我們再來探討下抽象工廠模式。
某一天,唐三藏一行人西行的路上遇到了一個強大無比的妖怪,唐僧被抓走了,光靠悟空他們沒有辦法把唐僧救回來,這個時候就需要找救兵了。悟空他們第一時間想到的就是天庭,但是奈何現在沒有這個工廠啊,怎麼辦?所以得按照原來的套路,再建多一個第三方工廠來解決第三方幫手的問題。還是先從圖瞭解下先:
(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)效果圖
抽象工廠模式,本質就是不同的工廠生產不同的產品,然後我們需要用產品的時候,就選擇哪個工廠生產哪種產品。