????專欄介紹
【JAVA長虹鍵法】 主要講了23種設計模式,本系列專欄會以虹貓藍兔七俠傳的故事為例來給大家詳細分析所有模式,希望能給大家帶來幫助!
????本期介紹
模式: 普通工廠模式
案例: 一個天外隕石(抽象産品),七劍(産品)
一個鑄劍傳承(抽象工廠),兩個鑄劍師(工廠)
男鑄劍師負責鑄造至陽之劍(長虹劍、青光劍、奔雷劍、旋風劍、雨花劍)
女鑄劍師負責鑄造至陰之劍(冰魄劍、紫雲劍)
文章目錄
- ????專欄介紹
- ????本期介紹
- ????什麼是工廠模式
- ????優點
- ????缺點
- ????應用場景
- ????普通工廠的實作
- ????抽象産品、産品
- ????抽象工廠、工廠
- ????測試
- 下期預告
????什麼是工廠模式
在《【JAVA長虹鍵法】第三式 簡單工廠模式》一期中我們介紹了簡單工廠模式,提到了簡單工廠模式違背了開閉原則,而“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的産品,即滿足開閉原則。
????優點
1、使用者隻需要知道具體工廠的名稱就可得到所要的産品,無須知道産品的具體建立過程。
2、靈活性增強,對于新産品的建立,隻需多寫一個相應的工廠類。
3、典型的解耦架構。高層子產品隻需要知道産品的抽象類,無須關心其他實作類,滿足迪米特法則、依賴倒置原則和裡氏替換原則。
????缺點
1、類的個數容易過多,增加複雜度
2、增加了系統的抽象性和了解難度
3、抽象産品隻能生産一種産品,此弊端可使用抽象工廠模式解決。
????應用場景
1、客戶隻知道建立産品的工廠名,而不知道具體的産品名。如 TCL 電視工廠、海信電視工廠等。
2、建立對象的任務由多個具體子工廠中的某一個完成,而抽象工廠隻提供建立産品的接口。
3、客戶不關心建立産品的細節,隻關心産品的品牌
????普通工廠的實作
案例的主要角色如下:
抽象工廠(Abstract Factory):鑄劍傳承
工廠(SimpleFactory):男鑄劍師、女鑄劍師
抽象産品(Product):天外隕石(鑄劍的原材料)
具體産品(ConcreteProduct):長虹劍、青光劍、奔雷劍、旋風劍、雨花劍、冰魄劍、紫雲劍
案例:
七劍分陰陽,長虹劍、青光劍、奔雷劍、旋風劍、雨花劍屬至陽之劍。
冰魄劍、紫雲劍屬至陰之劍。
男鑄劍師傳承了打造至陽之劍的方法,女鑄劍師傳承了打造至陰之劍的方法。
七俠分别找兩位鑄劍師打造屬于自己的劍
????抽象産品、産品
Ss接口(天外隕石):
接口内聲明了一個方法
public interface Ss {
void show();
}
Aa類實作接口Ss(長虹劍):
實作Ss接口
public class Aa implements Ss {
@Override
public void show() {
System.out.println("打造了一把長虹劍");
}
}
Bb類實作接口Ss(冰魄劍):
實作Ss接口
public class Bb implements Ss {
@Override
public void show() {
System.out.println("打造了一把冰魄劍");
}
}
Cc類實作接口Ss(紫雲劍):
實作Ss接口
public class Cc implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫雲劍");
}
}
Dd類實作接口Ss(雨花劍):
實作Ss接口
public class Dd implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫雲劍");
}
}
Ee類實作接口Ss(青光劍):
實作Ss接口
public class Ee implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫雲劍");
}
}
Ff類實作接口Ss(奔雷劍):
實作Ss接口
public class Ff implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫雲劍");
}
}
Gg類實作接口Ss(旋風劍):
實作Ss接口
public class Gg implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫雲劍");
}
}
????抽象工廠、工廠
Zz接口(鑄劍傳承):
接口内聲明了一個鑄劍方法abc()
public interface Zz {
Ss abc(String a);
}
Nan類實作接口Zz(男鑄劍師):
實作Zz接口
public class Nan implements Zz {
private static Ss ss;
public Ss abc(String a) {
if ("長虹劍".equals(a)) {
ss = new Aa();
} else if ("奔雷劍".equals(a)) {
ss = new Ff();
} else if ("青光劍".equals(a)) {
ss = new Ee();
} else if ("雨花劍".equals(a)) {
ss = new Dd();
} else if ("旋風劍".equals(a)) {
ss = new Gg();
} else {
System.out.println("鑄劍失敗");
}
return ss;
}
}
Nv類實作接口Zz(女鑄劍師):
實作Zz接口
public class Nv implements Zz {
private static Ss ss;
public Ss abc(String a) {
if ("冰魄劍".equals(a)) {
ss = new Bb();
} else if ("紫雲劍".equals(a)) {
ss = new Cc();
} else {
System.out.println("鑄劍失敗");
}
return ss;
}
}
????測試
public class Demo {
public static void main(String[] args) {
System.out.println("---------至陽之劍-------------");
//男鑄劍師
Nan nan = new Nan();
Ss aa = nan.abc("長虹劍");
Ss dd = nan.abc("雨花劍");
Ss ee = nan.abc("青光劍");
Ss ff = nan.abc("奔雷劍");
Ss gg = nan.abc("旋風劍");
aa.show();
dd.show();
ee.show();
ff.show();
gg.show();
System.out.println("---------至陰之劍-------------");
//女鑄劍師
Nv nv = new Nv();
Ss bb = nv.abc("冰魄劍");
Ss cc = nv.abc("紫雲劍");
bb.show();
cc.show();
}
}