
1.定義
1.工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替new操作的一種模式,讓類的實(shí)例化推遲到子類中進(jìn)行,屬于創(chuàng)建型模式
2.作用
- 降低程序之間的耦合度
- 提高擴(kuò)展性,降低修改量
3.案例
以生產(chǎn)汽車為例,定義一個(gè)ICar接口,汽車都有發(fā)動(dòng)機(jī)(Engine),和品牌(brand)提供這兩個(gè)方法,再定義兩個(gè)實(shí)現(xiàn)類寶馬和奧迪,分別對(duì)接口提供的兩個(gè)方法做不同的實(shí)現(xiàn),代碼如下
public interface ICar {
//發(fā)動(dòng)機(jī)
void Engine();
//品牌
void brand();
}
public class BMW implements ICar{
@Override
public void engine() {
System.out.println("寶馬的發(fā)動(dòng)機(jī)");
}
@Override
public void brand() {
System.out.println("寶馬的品牌");
}
}
public class Audi implements ICar {
@Override
public void engine() {
System.out.println("奧迪的發(fā)動(dòng)機(jī)");
}
@Override
public void brand() {
System.out.println("奧迪的品牌");
}
}
接下來(lái)定義一個(gè)汽車工廠來(lái)創(chuàng)建的汽車,汽車工廠有一個(gè)create方法根據(jù)方法的參數(shù)創(chuàng)建汽車,其參數(shù)是ICar的實(shí)現(xiàn)類,代碼如下:
//汽車工廠
public class CarFactory {
//生產(chǎn)汽車
public <T extends ICar> T create(Class<T> c){
ICar car = null;
try {
//根據(jù)類名new一個(gè)類
car = (ICar) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) car;
}
}
OK!簡(jiǎn)單的工廠模式就實(shí)現(xiàn)完畢,讓我們開(kāi)始生產(chǎn)汽車吧~
public static void main(String[] args) {
//new 一個(gè)工廠
CarFactory factory = new CarFactory();
//生產(chǎn)寶馬
ICar car= factory.create(BMW.class);
car.brand();
car.engine();
//生產(chǎn)奧迪
ICar car2= factory.create(Audi.class);
car2.brand();
car2.engine();
}
運(yùn)行一波看看結(jié)果:
寶馬的品牌
寶馬的發(fā)動(dòng)機(jī)
奧迪的品牌
奧迪的發(fā)動(dòng)機(jī)
再分析一下實(shí)現(xiàn)過(guò)程:第一步把汽車的共性放到了ICar接口,第二步創(chuàng)建實(shí)現(xiàn)類,做不同的實(shí)現(xiàn)。第三步寫(xiě)一個(gè)工廠類里面有一個(gè)create方法,通過(guò)調(diào)用這個(gè)方法生產(chǎn)不同的汽車。實(shí)際上工廠模式在項(xiàng)目開(kāi)發(fā)中的使用頻率是非常高的,再說(shuō)一個(gè)升級(jí)版本多個(gè)工廠類,在做一些復(fù)雜的項(xiàng)目中,經(jīng)常會(huì)被用到
多個(gè)工廠類的抽象工廠,把工廠類的Create方法放到一個(gè)抽象類中,不同的工廠做不同的實(shí)現(xiàn),
public interface BaseCarFactory {
ICar create();
}
奧迪汽車工廠創(chuàng)建奧迪汽車
//奧迪汽車工廠
public class AudiCarFactory implements BaseCarFactory {
@Override
public ICar create() {
return new Audi();
}
}
寶馬汽車工廠創(chuàng)建寶馬汽車
//寶馬汽車工廠
public class BMWCarFactory implements BaseCarFactory {
@Override
public ICar create() {
return new BMW();
}
}
Audi和BMW兩個(gè)類不變,Main函數(shù)修改如下,直接用具體的工廠,實(shí)例化具體的類
public static void main(String[] args) {
//new 一個(gè)奧迪汽車工廠,實(shí)例化奧迪
ICar car = new AudiCarFactory().create();
car.brand();
car.Engine();
ICar car2 = new BMWCarFactory().create();
car2.brand();
car2.Engine();
}
打印結(jié)果和以前一樣
奧迪的品牌
奧迪的發(fā)動(dòng)機(jī)
寶馬的品牌
寶馬的發(fā)動(dòng)機(jī)
多工廠模式可使結(jié)構(gòu)更加的清晰,更易于實(shí)現(xiàn)特定的需求,適合在比較復(fù)雜的項(xiàng)目邏輯中使用,但又給擴(kuò)展性帶來(lái)了影響,因?yàn)槿绻阋獢U(kuò)展某各實(shí)現(xiàn)類,就需要修改相應(yīng)的工廠類,
4.總結(jié)
工廠方法模式將不變的部分提取出來(lái),將可變的部分留作接口,以達(dá)到最大程度上的復(fù)用。當(dāng)一個(gè)類不知道它所必須創(chuàng)建對(duì)象的類或一個(gè)類希望由子類來(lái)指定它所創(chuàng)建的對(duì)象時(shí),當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),可以使用工廠方法。