相關文章
設計模式系列java
此前講解過簡單工廠模式和工廠模式,這一篇咱們來學習工廠系列的最後一個模式抽象工廠模式,建議在閱讀此文前,請先閱讀設計模式(四)簡單工廠模式、設計模式(十)工廠方法模式這兩篇文章。設計模式
抽象工廠模式能夠說是是工廠方法模式的升級版,當須要建立的產品有多個產品線(產品族)時使用抽象工廠模式是比較好的選擇。那什麼是多個產品線呢?拿咱們在設計模式(四)簡單工廠模式、設計模式(十)工廠方法模式中學習的生產電腦的例子來舉例,咱們一直都是生產聯想和惠普的電腦,可是電腦也有多個產品線:臺式機、筆記本和平板等等,聯想和惠普都在生產這些不一樣產品線上的電腦,使用工廠方法模式已經知足不了需求,這一篇文章咱們就用抽象工廠模式來解決這一問題。ide
抽象工廠模式定義
爲建立一組相關或者相互依賴的對象提供一個接口,而無需指定它們的具體類。學習
抽象工廠模式UML圖
spa
在抽象工廠模式中有以下角色:.net
聯想和惠普生產的電腦分爲了兩個產品線,一個臺式機,一個是筆記本。爲了解決增長產品線的問題,咱們用抽象工廠模式來進行實現。設計
抽象產品
首先定義抽象產品類:code
public abstract class DesktopComputer {
public abstract void start();
}
public abstract class NotebookComputer {
public abstract void start();
}複製代碼
兩個抽象產品類分別爲DesktopComputer和NotebookComputer ,用來定義兩個產品線:臺式機和筆記本。它們都定義了start方法,用來啓動電腦。
具體產品
具體產品爲聯想和惠普旗下的臺式機和筆記本,以下所示。cdn
public class LenovoDesktopComputer extends DesktopComputer {
@Override
public void start() {
System.out.println("聯想臺式電腦啓動");
}
}
public class HpDesktopComputer extends DesktopComputer {
@Override
public void start() {
System.out.println("惠普臺式電腦啓動");
}
}
public class LenovoNotebookComputer extends NotebookComputer {
@Override
public void start() {
System.out.println("聯想筆記本電腦啓動");
}
}
public class HpNotebookComputer extends NotebookComputer {
@Override
public void start() {
System.out.println("惠普筆記本電腦啓動");
}
}複製代碼
抽象工廠
接着建立生產電腦的抽象工廠,以下所示,對象
public abstract class ComputerFactory {
public abstract DesktopComputer createDesktopComputer();
public abstract NotebookComputer createNotebookComputer();
}複製代碼
定義了兩個方法,分別用來生產臺式電腦和筆記本電腦。
具體工廠
定義聯想和惠普工廠:
public class LenovoFactory extends ComputerFactory {
@Override
public DesktopComputer createDesktopComputer() {
return new LenovoDesktopComputer();
}
@Override
public NotebookComputer createNotebookComputer() {
return new LenovoNotebookComputer();
}
}
public class HpFactory extends ComputerFactory {
@Override
public DesktopComputer createDesktopComputer() {
return new HpDesktopComputer();
}
@Override
public NotebookComputer createNotebookComputer() {
return new HpNotebookComputer();
}
}複製代碼
聯想工廠和惠普工廠用來生產臺式機和筆記本這兩個不一樣產品線的電腦。
客戶端調用
最後編寫客戶端:
public class Client {
public static void main(String[]args) {
ComputerFactory lenocoFactory=new LenovoFactory();
lenocoFactory.createDesktopComputer().start();
lenocoFactory.createNotebookComputer().start();
ComputerFactory hpFactory=new HpFactory();
hpFactory.createDesktopComputer().start();
hpFactory.createNotebookComputer().start();
}
}複製代碼
分別用LenovoFactory和HpFactory生產臺式和筆記本電腦,並調用start方法啓動它們。
運行結果爲:
聯想臺式電腦啓動
聯想筆記本電腦啓動
惠普臺式電腦啓動
惠普筆記本電腦啓動
接下來給出這個例子的UML圖,更便於理解,以下所示。
優勢
具體類的建立實例過程與客戶端分離,客戶端經過工廠的抽象接口操縱實例,客戶端並不知道具體的實現是誰。
缺點
若是增長新的產品族則也須要修改抽象工廠和全部的具體工廠。
參考資料《大話設計模式》《設計模式之禪》《Android源碼設計模式》