【翻譯】原文鏈接:
http://www.journaldev.com/1392/factory-design-pattern-in-java
什么是工廠模式
- 工廠模式是一種廣泛使用的設(shè)計(jì)模式,被廣泛使用與JDK和一些框架中,比如著名的Spring和Struts框架。
- 工廠模式使用的場(chǎng)景:當(dāng)有多個(gè)子類(lèi)有一個(gè)相同的基類(lèi),根據(jù)不同的輸入,產(chǎn)生不同的子類(lèi)對(duì)象的輸出,在高層次設(shè)計(jì)好之后被Client類(lèi)調(diào)用。Cilent只需要告訴Factory它需要什么類(lèi)型的對(duì)象,F(xiàn)actory就給它生成對(duì)應(yīng)的對(duì)象。
- 舉個(gè)例子:比如我們寫(xiě)俄羅斯方塊這個(gè)小游戲,有各種各樣的圖形,但它們都繼承自一個(gè)Shape的基類(lèi),我們?cè)谟螒蛑行枰S機(jī)產(chǎn)生圖形對(duì)象,那么此時(shí)就可以使用工廠設(shè)計(jì)模式。
工廠模式如何實(shí)現(xiàn)
Super class(父類(lèi))
--Super class in factory pattern can be an interace,abstract class or nomal java class.
--作為父類(lèi)可以是一個(gè)接口,一個(gè)抽象類(lèi)或者是一個(gè)正常的java類(lèi)
--看一個(gè)例子:Computer.java
--這是一個(gè)抽象的基類(lèi)
<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>
Sub Class(子類(lèi))
--這里有兩個(gè)Computer的實(shí)現(xiàn)類(lèi):PC和Server;
-
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>
- 注意:以上兩個(gè)類(lèi)都是繼承自Computer,實(shí)際工程中我們還可以有其他的若干子類(lèi)
Factory Class(工廠類(lèi))
--已經(jīng)有了父類(lèi)和基類(lèi),那么接下來(lái)我們可以寫(xiě)我們的工廠類(lèi)了,下面是一個(gè)基本的實(shí)現(xiàn):
-
ComputerFactory.java
<code>
package com.journaldev.design.factory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
import com.journaldev.design.model.Server;
public class ComputerFactory {
public static Computer getComputer(String type, String ram, String hdd, String cpu){
if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);return null;
}
}
</code>
--此處,我們可以當(dāng)工廠類(lèi)為單例或者讓返回不同對(duì)象的工廠方法為public static的。
--注意:工廠方法根據(jù)不同的輸入?yún)?shù),返回不同的子類(lèi)對(duì)象 -
下面是一個(gè)簡(jiǎn)單的模型圖:
factory-model.png TestFatory.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 TestFactory {
public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
System.out.println("Factory PC Config::"+pc);
System.out.println("Factory Server Config::"+server);
}
}
out:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
</code>
工廠模式的好處
--使用工廠模式,我們把創(chuàng)建對(duì)象的代碼從Client脫離出來(lái),Client只需要調(diào)用我們提供的接口方法,而具體實(shí)現(xiàn)被我們所隱藏,使得代碼更健壯,高內(nèi)聚,易擴(kuò)展。比如,我們可以輕易的改變PC的實(shí)現(xiàn)代碼因?yàn)镃lient程序并不知道它原來(lái)的具體實(shí)現(xiàn)。