設計模式(五)抽象工廠模式
1.抽象工廠模式定義
抽象工廠模式可以說是是工廠方法模式的升級版,當需要創(chuàng)建的產(chǎn)品有多個產(chǎn)品線(產(chǎn)品族)時使用抽象工廠模式是比較好的選擇。那什么是多個產(chǎn)品線呢?拿我們在簡單工廠模式和工廠方法模式中學習的生產(chǎn)電腦的例子來舉例,我們一直都是生產(chǎn)聯(lián)想和惠普的電腦,但是電腦也有多個產(chǎn)品線:臺式機、筆記本和平板等等,聯(lián)想和惠普都在生產(chǎn)這些不同產(chǎn)品線上的電腦,使用工廠方法模式已經(jīng)滿足不了需求,這一篇文章我們就用抽象工廠模式來解決這一問題。
2.抽象工廠模式簡單實現(xiàn)
聯(lián)想和惠普生產(chǎn)的電腦分為了兩個產(chǎn)品線,一個臺式機,一個是筆記本。為了解決增加產(chǎn)品線的問題,我們用抽象工廠模式來進行實現(xiàn)。
①抽象產(chǎn)品
首先定義抽象產(chǎn)品類:
public abstract class DesktopComputer { public abstract void start(); } public abstract class NotebookComputer { public abstract void start(); }
兩個抽象產(chǎn)品類分別為DesktopComputer和NotebookComputer ,用來定義兩個產(chǎn)品線:臺式機和筆記本。它們都定義了start方法,用來啟動電腦。
②具體產(chǎn)品
具體產(chǎn)品為聯(lián)想和惠普旗下的臺式機和筆記本,如下所示。
public class LenovoDesktopComputer extends DesktopComputer { @Override public void start() { System.out.println("聯(lián)想臺式電腦啟動"); } } public class HpDesktopComputer extends DesktopComputer { @Override public void start() { System.out.println("惠普臺式電腦啟動"); } } public class LenovoNotebookComputer extends NotebookComputer { @Override public void start() { System.out.println("聯(lián)想筆記本電腦啟動"); } } public class HpNotebookComputer extends NotebookComputer { @Override public void start() { System.out.println("惠普筆記本電腦啟動"); }
③抽象工廠
接著創(chuàng)建生產(chǎn)電腦的抽象工廠,如下所示,
public abstract class ComputerFactory { public abstract DesktopComputer createDesktopComputer(); public abstract NotebookComputer createNotebookComputer(); }
定義了兩個方法,分別用來生產(chǎn)臺式電腦和筆記本電腦。
④具體工廠
定義聯(lián)想和惠普工廠:
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(); } }
聯(lián)想工廠和惠普工廠用來生產(chǎn)臺式機和筆記本這兩個不同產(chǎn)品線的電腦。
⑤客戶端調(diào)用
最后編寫客戶端:
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生產(chǎn)臺式和筆記本電腦,并調(diào)用start方法啟動它們。
運行結(jié)果為:
聯(lián)想臺式電腦啟動
聯(lián)想筆記本電腦啟動
惠普臺式電腦啟動
惠普筆記本電腦啟動
3.抽象工廠模式的優(yōu)缺點
優(yōu)點
具體類的創(chuàng)建實例過程與客戶端分離,客戶端通過工廠的抽象接口操縱實例,客戶端并不知道具體的實現(xiàn)是誰。
缺點
如果增加新的產(chǎn)品族則也需要修改抽象工廠和所有的具體工廠。
抽象工廠模式的使用場景
- 一個系統(tǒng)不依賴于產(chǎn)品線實例如何被創(chuàng)建、組合和表達的細節(jié)。
- 系統(tǒng)中有多于一個的產(chǎn)品線,而每次只使用其中某一產(chǎn)品線。
- 一個產(chǎn)品線(或是一組沒有任何關系的對象)擁有相同的約束。
抽象工廠模式與工廠方法模式最大的區(qū)別:抽象工廠中每個工廠可以創(chuàng)建多種類的產(chǎn)品;而工廠方法每個工廠只能創(chuàng)建一類

浙公網(wǎng)安備 33010602011771號