
抽象工廠模式
- 抽象工廠模式是**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)生自家工廠的配件。

創(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>
一張模型圖

總結(jié)&&抽象工廠模式的好處
- 具有工廠模式的所有好處
- 比傳統(tǒng)工廠模式更具有拓展性
- 抽象工廠即工廠中的工廠
-
通俗理解:
以前我家有一個包子店,每天會生產(chǎn)很多的包子:肉包,菜包和糖包,因為我的包子可口好吃,每天來買包子的人就越來越多,這樣的一個包子鋪忙不過來。然后我把包子鋪拆分為三個小包子鋪:分別生產(chǎn)肉包,菜包和糖包,這樣問題解決了,效率也上去了,我掙得錢也越來越多了。 - 這就是所謂的分工