設計模式—抽象工廠模式
阿新 • • 發佈:2017-05-17
elm 步驟 cli 優點 abstract 工程師 face abs ges
場景問題
舉個生活中常見的例子——組裝電腦,我們在組裝電腦的時候,通常需要選擇一系列的配件,比如CPU、硬盤、內存、主板、電源、機箱等。
需要整體考慮各個配件之間的兼容性。比如:CPU和主板,如果使用Intel的CPU和AMD的主板是根本無法組裝的。因為Intel的CPU針腳數與AMD主板提供的CPU插口不兼容,就是說如果使用Intel的CPU根本就插不到AMD的主板中,所以裝機方案是整體性的,裏面選擇的各個配件之間是有關聯的。
由於抽象工廠定義的一系列對象通常是相關或相互依賴的,這些產品對象就構成了一個產品族,也就是抽象工廠定義了一個產品族。
這就帶來非常大的靈活性,切換產品族的時候,只要提供不同的抽象工廠實現就可以了,也就是說現在是以一個產品族作為一個整體被切換。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 裏加代碼,又要在具體的裏面加代碼。
使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。
抽象工廠類:
public interface AbstractFactory { /** * 創建CPU對象 * @return CPU對象 */ public Cpu createCpu(); /** * 創建主板對象 * @return主板對象 */ public Mainboard createMainboard(); }
具體實現工廠類:
public class IntelFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new IntelCpu(755); } @Override public Mainboard createMainboard() {// TODO Auto-generated method stub return new IntelMainboard(755); } }
public class AmdFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new IntelCpu(938); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new IntelMainboard(938); } }
關於產品接口和具體產品實現類已經省略。
裝機工程師類:
public class ComputerEngineer { /** * 定義組裝機需要的CPU */ private Cpu cpu = null; /** * 定義組裝機需要的主板 */ private Mainboard mainboard = null; public void makeComputer(AbstractFactory af){ /** * 組裝機器的基本步驟 */ //1:首先準備好裝機所需要的配件 prepareHardwares(af); //2:組裝機器 //3:測試機器 //4:交付客戶 } private void prepareHardwares(AbstractFactory af){ //這裏要去準備CPU和主板的具體實現,為了示例簡單,這裏只準備這兩個 //可是,裝機工程師並不知道如何去創建,怎麽辦呢? //直接找相應的工廠獲取 this.cpu = af.createCpu(); this.mainboard = af.createMainboard(); //測試配件是否好用 this.cpu.calculate(); this.mainboard.installCPU(); } }
客戶端代碼:
public class Client { public static void main(String[]args){ //創建裝機工程師對象 ComputerEngineer cf = new ComputerEngineer(); //客戶選擇並創建需要使用的產品對象 AbstractFactory af = new IntelFactory(); //告訴裝機工程師自己選擇的產品,讓裝機工程師組裝電腦 cf.makeComputer(af); } }
文章摘選自:《JAVA與模式》之抽象工廠模式
設計模式—抽象工廠模式