定義:
工廠模式是 Java 中最常用的設(shè)計(jì)模式之一炼蛤。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式本刽。
工廠模式主要是為創(chuàng)建對(duì)象提供過(guò)渡接口鲸湃,以便將創(chuàng)建對(duì)象的具體過(guò)程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的子寓。
工廠模式根據(jù)抽象程度的不同分為三種:
- 簡(jiǎn)單工廠模式(也叫靜態(tài)工廠模式)
- 工廠方法模式(也叫多形性工廠)
- 抽象工廠模式(也叫工具箱)
簡(jiǎn)單工廠模式
實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù)暗挑,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例。簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)斜友,所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例炸裆。
工廠方法模式
工廠方法是粒度很小的設(shè)計(jì)模式,因?yàn)槟J降谋憩F(xiàn)只是一個(gè)抽象的方法鲜屏。 提前定義用于創(chuàng)建對(duì)象的接口烹看,讓子類決定實(shí)例化具體的某一個(gè)類国拇,即在工廠和產(chǎn)品中間增加接口,工廠不再負(fù)責(zé)產(chǎn)品的創(chuàng)建惯殊,由接口針對(duì)不同條件返回具體的類實(shí)例酱吝,由具體類實(shí)例去實(shí)現(xiàn)。
抽象工廠模式
當(dāng)有多個(gè)抽象角色時(shí)使用的一種工廠模式土思。抽象工廠模式可以向客戶端提供一個(gè)接口务热,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品對(duì)象己儒。它有多個(gè)抽象產(chǎn)品類崎岂,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類,一個(gè)抽象工廠類闪湾,可以派生出多個(gè)具體工廠類冲甘,每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。
工廠方法模式應(yīng)該在實(shí)際中用的較多途样,我們以工廠方法模式舉例
抽象的產(chǎn)品類:定義car 交通工具類
public interface Car {
void gotowork();
}
定義實(shí)際的產(chǎn)品類江醇,總共定義兩個(gè),bike 和bus 分別表示不同的交通工具類
public class Bike implements Car {
@Override
public void gotowork() {
System.out.println("騎自行車去上班娘纷!");
}
}
public class Bus implements Car {
@Override
public void gotowork() {
System.out.println("坐公交車去上班嫁审!");
}
}
定義抽象的工廠接口
public interface ICarFactory {
Car getCar();
}
具體的工廠子類,分別為每個(gè)具體的產(chǎn)品類創(chuàng)建不同的工廠子類
public class BikeFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bike();
}
}
public class BusFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bus();
}
}
簡(jiǎn)單的測(cè)試類赖晶,來(lái)驗(yàn)證不同的工廠能夠產(chǎn)生不同的產(chǎn)品對(duì)象
public class TestFactory {
@Test
public void test() {
ICarFactory factory = null;
// bike
factory = new BikeFactory();
Car bike = factory.getCar();
bike.gotowork();
// bus
factory = new BusFactory();
Car bus = factory.getCar();
bus.gotowork();
}
}
工廠模式的優(yōu)點(diǎn):
1律适、一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道其名稱就可以了遏插,降低了耦合度捂贿。
2、擴(kuò)展性高胳嘲,如果想增加一個(gè)產(chǎn)品厂僧,只要擴(kuò)展一個(gè)工廠類就可以。使得代碼結(jié)構(gòu)更加清晰了牛。
3颜屠、屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口鹰祸。
工廠模式的缺點(diǎn):
每次增加一個(gè)產(chǎn)品時(shí)甫窟,都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠(這里可以使用反射機(jī)制來(lái)避免),使得系統(tǒng)中類的個(gè)數(shù)成倍增加蛙婴,在一定程度上增加了系統(tǒng)的復(fù)雜度粗井,同時(shí)也增加了系統(tǒng)具體類的依賴。所以對(duì)于簡(jiǎn)單對(duì)象來(lái)說(shuō),使用工廠模式反而增加了復(fù)雜度浇衬。
工廠模式的適用場(chǎng)景:
1懒构, 一個(gè)對(duì)象擁有很多子類。
2耘擂, 創(chuàng)建某個(gè)對(duì)象時(shí)需要進(jìn)行許多額外的操作胆剧。
3, 系統(tǒng)后期需要經(jīng)常擴(kuò)展梳星,它把對(duì)象實(shí)例化的任務(wù)交由實(shí)現(xiàn)類完成赞赖,擴(kuò)展性好。