【抽象工廠模式】Abstract Factory Design Pattern

Abstract_Factory.png

抽象工廠模式

  • 抽象工廠模式是**Creational **模式之一
  • 抽象工廠模式和工廠模式很相似,甚至可以說抽象工廠模式是產(chǎn)生工廠的工廠模式
  • 熟悉工廠模式的同學(xué)知道,在工廠模式中我們使用If-else對輸入?yún)?shù)進行判斷然后生產(chǎn)不同的實例對象
  • 而在抽象工廠模式中我們卻不這樣做,我們會對每一個子類創(chuàng)建一個工廠專用于產(chǎn)生此類對象
  • 比如:下圖中的汽車門在工廠模式中我們可能只有一個工廠類名為:CarStampFactory()然后根據(jù)不同的輸入返回不同的對象:StampRightDoor,StampLeftDoor,StampHood等。
    而使用抽象工廠模式,就為每一個汽車配件創(chuàng)造一個工廠:
    StampRightDoorFactory,StampLeftDoorFactory,StampHoodFactory,各工廠只做一件事情,只產(chǎn)生自家工廠的配件。
Abstract_Factory_example.png

創(chuàng)建抽象工廠的步驟:

第一步:創(chuàng)建Super Classs 和 Sub Class:

--需要被Client大量使用的類和對象
--Super Class 可以為接口 ,抽象類或是正常的類
--Sub Class 實現(xiàn)或者繼承自父類,然后個性化自己

  • Computer.java
    <code>
    package com.journaldev.design.model;

public abstract class Computer {

public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
  
@Override
public String toString(){
    return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}

}
</code>

  • PC.java
    <code>
    package com.journaldev.design.model;

public class PC extends Computer {

private String ram;
private String hdd;
private String cpu;
  
public PC(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public String getRAM() {
    return this.ram;
}

@Override
public String getHDD() {
    return this.hdd;
}

@Override
public String getCPU() {
    return this.cpu;
}

}
</code>

  • Server.java
    <code>
    package com.journaldev.design.model;

public class Server extends Computer {

private String ram;
private String hdd;
private String cpu;
  
public Server(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public String getRAM() {
    return this.ram;
}

@Override
public String getHDD() {
    return this.hdd;
}

@Override
public String getCPU() {
    return this.cpu;
}

}
</code>

第二步:創(chuàng)建Abstract Factory Class

  • ComputerAbstractFactory.java
    <code>
    package com.journaldev.design.abstractfactory;
    import com.journaldev.design.model.Computer;
    public interface ComputerAbstractFactory {
    public Computer createComputer();
    }
    </code>
  • 注意: 此處返回 頂級父類:Computer,依據(jù)java的泛型特性,可以返回很多Computer的子類,具有很好的擴展性

第三步:創(chuàng)建個Sub Class 的工廠方法

  • PCFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;

public class PCFactory implements ComputerAbstractFactory {

private String ram;
private String hdd;
private String cpu;
 
public PCFactory(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public Computer createComputer() {
    return new PC(ram,hdd,cpu);
}

}
Similarly
</code>
同樣的我們再創(chuàng)建 ServerFactory.java

  • ServerFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;

public class ServerFactory implements ComputerAbstractFactory {

private String ram;
private String hdd;
private String cpu;
 
public ServerFactory(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
 
@Override
public Computer createComputer() {
    return new Server(ram,hdd,cpu);
}

}
</code>
.....根據(jù)需求我們還能創(chuàng)建很多的Factory類.....

第四步:創(chuàng)建一個 consumer class 作為入口供Client調(diào)用

  • ComputerFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public class ComputerFactory {
public static Computer getComputer(ComputerAbstractFactory factory){
return factory.createComputer();
}
}
</code>

  • ** 注意:其實我覺得這一步完全沒有必要用,有點多余。**

第五步:測試程序

  • TestDesignPatterns.java
    <code>
    package com.journaldev.design.test;
    import com.journaldev.design.abstractfactory.PCFactory;
    import com.journaldev.design.abstractfactory.ServerFactory;
    import com.journaldev.design.factory.ComputerFactory;
    import com.journaldev.design.model.Computer;
    public class TestDesignPatterns {
    public static void main(String[] args) {
    testAbstractFactory(); }
    private static void testAbstractFactory() {
    Computer pc = ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
    Computer server = ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
    System.out.println("AbstractFactory PC Config::"+pc);
    System.out.println("AbstractFactory Server Config::"+server);
    }
    }
    </code>

一張模型圖

class diagram.png

總結(jié)&&抽象工廠模式的好處

  • 具有工廠模式的所有好處
  • 比傳統(tǒng)工廠模式更具有拓展性
  • 抽象工廠即工廠中的工廠
  • 通俗理解:
    以前我家有一個包子店,每天會生產(chǎn)很多的包子:肉包,菜包和糖包,因為我的包子可口好吃,每天來買包子的人就越來越多,這樣的一個包子鋪忙不過來。然后我把包子鋪拆分為三個小包子鋪:分別生產(chǎn)肉包,菜包和糖包,這樣問題解決了,效率也上去了,我掙得錢也越來越多了。
  • 這就是所謂的分工
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 什么是工廠模式 工廠模式是一種廣泛使用的設(shè)計模式,被廣泛使用與JDK和一些框架中,比如著名的Spring和Stru...
    jackLee閱讀 1,124評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,637評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,010評論 0 11
  • 結(jié)合簡單示例和UML圖,講解工廠模式簡單原理。 一、引子 話說十年前,有一個爆發(fā)戶,他家有三輛汽車(Benz(奔馳...
    某人在閱讀 1,392評論 1 6

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