抽象工廠模式
- 抽象工廠模式是**Creational **模式之一
- 抽象工廠模式和工廠模式很相似尔破,甚至可以說抽象工廠模式是產(chǎn)生工廠的工廠模式
- 熟悉工廠模式的同學(xué)知道携丁,在工廠模式中我們使用If-else對(duì)輸入?yún)?shù)進(jìn)行判斷然后生產(chǎn)不同的實(shí)例對(duì)象
- 而在抽象工廠模式中我們卻不這樣做平酿,我們會(huì)對(duì)每一個(gè)子類創(chuàng)建一個(gè)工廠專用于產(chǎn)生此類對(duì)象
- 比如:下圖中的汽車門在工廠模式中我們可能只有一個(gè)工廠類名為:CarStampFactory()然后根據(jù)不同的輸入返回不同的對(duì)象:StampRightDoor筛武,StampLeftDoor,StampHood等搜变。
而使用抽象工廠模式孟岛,就為每一個(gè)汽車配件創(chuàng)造一個(gè)工廠:
StampRightDoorFactory,StampLeftDoorFactory,StampHoodFactory瓶竭,各工廠只做一件事情督勺,只產(chǎn)生自家工廠的配件。
創(chuàng)建抽象工廠的步驟:
第一步:創(chuàng)建Super Classs 和 Sub Class:
--需要被Client大量使用的類和對(duì)象
--Super Class 可以為接口 在验,抽象類或是正常的類
--Sub Class 實(shí)現(xiàn)或者繼承自父類玷氏,然后個(gè)性化自己
- 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> - 注意: 此處返回 頂級(jí)父類:Computer,依據(jù)java的泛型特性腋舌,可以返回很多Computer的子類盏触,具有很好的擴(kuò)展性
第三步:創(chuàng)建個(gè)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>
同樣的我們?cè)賱?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)建一個(gè) 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>
- ** 注意:其實(shí)我覺得這一步完全沒有必要用,有點(diǎn)多余块饺。**
第五步:測試程序
- 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)工廠模式更具有拓展性
- 抽象工廠即工廠中的工廠
-
通俗理解:
以前我家有一個(gè)包子店赞辩,每天會(huì)生產(chǎn)很多的包子:肉包,菜包和糖包授艰,因?yàn)槲业陌涌煽诤贸员嫠裕刻靵碣I包子的人就越來越多,這樣的一個(gè)包子鋪忙不過來淮腾。然后我把包子鋪拆分為三個(gè)小包子鋪:分別生產(chǎn)肉包糟需,菜包和糖包,這樣問題解決了谷朝,效率也上去了洲押,我掙得錢也越來越多了。 - 這就是所謂的分工