《設(shè)計(jì)模式》抽象工廠模式

定義

為創(chuàng)建一組相關(guān)或者相互依賴的對(duì)象提供一個(gè)接口,而無(wú)需指定它們的具體類。

介紹

  • 抽象工廠模式屬于創(chuàng)建型模式。
  • 工廠方法模式每個(gè)工廠只能創(chuàng)建一種類型的產(chǎn)品,而抽象工廠模式則能夠創(chuàng)建多種類型的產(chǎn)品。
  • 例如:硬盤(pán)工廠只生產(chǎn)硬盤(pán)這種產(chǎn)品,而電腦工廠則組合不同的硬盤(pán)、內(nèi)存、CPU等生產(chǎn)出電腦來(lái)。

UML類圖

抽象工廠UML類圖

角色說(shuō)明:

  • AbstractProduct(抽象產(chǎn)品類):定義產(chǎn)品的公共接口。
  • ConcreteProduct(具體產(chǎn)品類):定義產(chǎn)品的具體對(duì)象,實(shí)現(xiàn)抽象產(chǎn)品類中的接口。
  • AbstractFactory(抽象工廠類):定義工廠中用來(lái)創(chuàng)建不同產(chǎn)品的方法。
  • ConcreteFactory(具體工廠類):實(shí)現(xiàn)抽象工廠中定義的創(chuàng)建產(chǎn)品的方。

實(shí)現(xiàn)

1、創(chuàng)建抽象產(chǎn)品類,定義公共接口:

// 抽象產(chǎn)品類 -- CPU
public abstract class CPU {
  public abstract void showCPU();
}
// 抽象產(chǎn)品類 -- 內(nèi)存
public abstract class Memory {
  public abstract void showMemory();
}
// 抽象產(chǎn)品類 -- 硬盤(pán)
public abstract class HD {
  public abstract void showHD();
}

2、創(chuàng)建具體產(chǎn)品類、繼承Product類:

// 具體產(chǎn)品類 -- Intet CPU
public class IntelCPU extends CPU {
  @Override
  public void showCPU() {
    System.out.println("Intet CPU");
  }
}

// 具體產(chǎn)品類 -- AMD CPU
public class AmdCPU extends CPU {
  @Override
  public void showCPU() {
    System.out.println("AMD CPU");
  }
}

// 具體產(chǎn)品類 -- 三星 內(nèi)存
public class SamsungMemory extends Memory {
  @Override
  public void showMemory() {
    System.out.println("三星 內(nèi)存");
  }
}

// 具體產(chǎn)品類 -- 金士頓 內(nèi)存
public class KingstonMemory extends Memory {
  @Override
  public void showMemory() {
    System.out.println("金士頓 內(nèi)存");
  }
}

// 具體產(chǎn)品類 -- 希捷 硬盤(pán)
public class SeagateHD extends HD {
  @Override
  public void showHD() {
    System.out.println("希捷 硬盤(pán)");
  }
}

// 具體產(chǎn)品類 -- 西部數(shù)據(jù) 硬盤(pán)
public class WdHD extends HD {
  @Override
  public void showHD() {
    System.out.println("西部數(shù)據(jù) 硬盤(pán)");
  }
}

3、創(chuàng)建抽象工廠類,定義工廠中用來(lái)創(chuàng)建不同產(chǎn)品的方法:

// 抽象工廠類,電腦工廠類
public abstract class ComputerFactory {
  public abstract CPU createCPU();

  public abstract Memory createMemory();

  public abstract HD createHD();
}

4、創(chuàng)建具體工廠類,繼承Factory類:

// 具體工廠類 --聯(lián)想電腦
public class LenovoComputerFactory extends ComputerFactory {
  @Override
  public CPU createCPU() {
    return new IntelCPU();
  }

  @Override
  public Memory createMemory() {
    return new SamsungMemory();
  }

  @Override
  public HD createHD() {
    return new SeagateHD();
  }
}

// 具體工廠類 --華碩電腦
public class AsusComputerFactory extends ComputerFactory {
  @Override
  public CPU createCPU() {
    return new AmdCPU();
  }

  @Override
  public Memory createMemory() {
    return new KingstonMemory();
  }

  @Override
  public HD createHD() {
    return new WdHD();
  }
}

// 具體工廠類 --惠普電腦
public class HpComputerFactory extends ComputerFactory {
  @Override
  public CPU createCPU() {
    return new IntelCPU();
  }

  @Override
  public Memory createMemory() {
    return new KingstonMemory();
  }

  @Override
  public HD createHD() {
    return new WdHD();
  }
}

5、測(cè)試方法

public void test() {
  System.out.println("--------------------生產(chǎn)聯(lián)想電腦-----------------------");
  ComputerFactory lenovoComputerFactory = new LenovoComputerFactory();
  lenovoComputerFactory.createCPU().showCPU();
  lenovoComputerFactory.createMemory().showMemory();
  lenovoComputerFactory.createHD().showHD();

  System.out.println("--------------------生產(chǎn)華碩電腦-----------------------");
  ComputerFactory asusComputerFactory = new AsusComputerFactory();
  asusComputerFactory.createCPU().showCPU();
  asusComputerFactory.createMemory().showMemory();
  asusComputerFactory.createHD().showHD();

  System.out.println("--------------------生產(chǎn)惠普電腦-----------------------");
  ComputerFactory hpComputerFactory = new HpComputerFactory();
  hpComputerFactory.createCPU().showCPU();
  hpComputerFactory.createMemory().showMemory();
  hpComputerFactory.createHD().showHD();
}

6、輸出結(jié)果為:

--------------------生產(chǎn)聯(lián)想電腦-----------------------
Intet CPU
三星 內(nèi)存
希捷 硬盤(pán)
--------------------生產(chǎn)華碩電腦-----------------------
AMD CPU
金士頓 內(nèi)存
西部數(shù)據(jù) 硬盤(pán)
--------------------生產(chǎn)惠普電腦-----------------------
Intet CPU
金士頓 內(nèi)存
西部數(shù)據(jù) 硬盤(pán)

應(yīng)用場(chǎng)景

  • 生產(chǎn)多個(gè)產(chǎn)品組合的對(duì)象時(shí)。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 代碼解耦,創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開(kāi),使用者不必關(guān)心類對(duì)象如何創(chuàng)建。

缺點(diǎn)

  • 如果增加新的產(chǎn)品,則修改抽象工廠和所有的具體工廠,違反了開(kāi)放封閉原則

工廠方法模式 VS 抽象工廠模式

  • 在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品,每一個(gè)具體工廠對(duì)應(yīng)一種具體產(chǎn)品,工廠方法具有唯一性。
  • 抽象工廠模式則可以提供多個(gè)產(chǎn)品對(duì)象,而不是單一的產(chǎn)品對(duì)象。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容