1.抽象工廠模式介紹
抽象工廠模式是創(chuàng)建型設(shè)計(jì)模式,可以創(chuàng)建一組對(duì)象。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是創(chuàng)建一種產(chǎn)品,它負(fù)責(zé)創(chuàng)建一族產(chǎn)品。
● 抽象產(chǎn)品(Product):它是定義產(chǎn)品的接口,是具體產(chǎn)品的父類(lèi),是工廠創(chuàng)建的對(duì)象類(lèi)型,在java中一般有抽象類(lèi)或者接口來(lái)實(shí)現(xiàn)。
● 具體產(chǎn)品(ConcreteProduct):它定義具體工廠生產(chǎn)的具體產(chǎn)品對(duì)象,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法。。
● 抽象工廠(Abstract Factory):它聲明了一組用于創(chuàng)建一族產(chǎn)品的方法,每一個(gè)方法對(duì)應(yīng)一種產(chǎn)品。
● 具體工廠(ConcreteFactory):它實(shí)現(xiàn)了在抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中。
2. 抽象工廠模式舉例
我們還以汽車(chē)舉例,各個(gè)類(lèi)和抽象工廠模式的各個(gè)角色的對(duì)應(yīng)關(guān)系如下;如你所見(jiàn),汽油車(chē)使用汽車(chē)和汽油這個(gè)產(chǎn)品族,電動(dòng)汽車(chē)使用電動(dòng)機(jī)和電池這個(gè)產(chǎn)品族。
序號(hào) | 類(lèi)名 | 角色 | 說(shuō)明 |
---|---|---|---|
1 | Engine | 抽象產(chǎn)品 | 引擎 |
2 | GasolineEngine | 具體產(chǎn)品 | 引擎子類(lèi),汽油發(fā)動(dòng)機(jī) |
3 | ElectricMachinery | 具體產(chǎn)品 | 引擎子類(lèi),電動(dòng)機(jī) |
4 | Energy | 抽象產(chǎn)品 | 能源 |
5 | Gas | 具體產(chǎn)品 | 能源子類(lèi),汽油 |
6 | Battery | 具體產(chǎn)品 | 能源子類(lèi),電池 |
7 | VehicleFactory | 抽象工廠 | 機(jī)動(dòng)車(chē)工廠,有2個(gè)方法 |
8 | GasVehicleFactory | 具體工廠 | 汽油車(chē)廠,使用汽油發(fā)動(dòng)機(jī)和汽油。 |
9 | ElectricVehicleFactory | 具體工廠 | 電動(dòng)汽車(chē)廠,使用電動(dòng)機(jī)和電池。 |
10 | FactoryMethodMain | 客戶(hù)端 | 調(diào)用發(fā)起類(lèi) |
1. Engine 引擎接口
/**
* 抽象產(chǎn)品,引擎。
*/
public interface Engine {
void start();
}
2. GasolineEngine 汽油發(fā)動(dòng)機(jī)
/**
* 具體產(chǎn)品類(lèi),汽油發(fā)動(dòng)機(jī)。
*/
public class GasolineEngine implements Engine {
@Override
public void start() {
System.out.println("我是汽油發(fā)動(dòng)機(jī)");
}
}
3. ElectricMachinery 電動(dòng)機(jī)
/**
* 具體產(chǎn)品類(lèi),電動(dòng)機(jī)。
*/
public class ElectricMachinery implements Engine {
@Override
public void start() {
System.out.println("我是電動(dòng)馬達(dá)");
}
}
4. Energy 能源接口
/**
* 抽象產(chǎn)品類(lèi),能量。
*/
public interface Energy {
// 釋放能量
void burn();
}
5. Gas 汽油
/**
* 具體產(chǎn)品類(lèi),汽油
*/
public class Gas implements Energy {
@Override
public void burn() {
System.out.println("我是汽油,燃燒釋放能量。");
}
}
6. Battery 電池
/**
* 具體產(chǎn)品類(lèi),電池
*/
public class Battery implements Energy {
@Override
public void burn() {
System.out.println("我是電池,放電釋放能量。");
}
}
7. VehicleFactory 抽象工廠
/**
* 抽象工廠
*/
public interface VehicleFactory {
// 生產(chǎn)引擎產(chǎn)品
Engine produceEngine();
// 生產(chǎn)能源產(chǎn)品
Energy produceEnergy();
}
8. GasVehicleFactory 汽油車(chē)廠,使用汽油發(fā)動(dòng)機(jī)和汽油。
/**
* 具體工廠類(lèi),汽油車(chē)廠,使用汽油發(fā)動(dòng)機(jī)和汽油。
*/
public class GasVehicleFactory implements VehicleFactory {
@Override
public Engine produceEngine() {
return new GasolineEngine();
}
@Override
public Energy produceEnergy() {
return new Gas();
}
}
9. ElectricVehicleFactory 電動(dòng)汽車(chē)廠,使用電動(dòng)機(jī)和電池。
/**
* 具體工廠類(lèi),電動(dòng)汽車(chē)廠,使用電動(dòng)機(jī)和電池。
*/
public class ElectricVehicleFactory implements VehicleFactory {
@Override
public Engine produceEngine() {
return new ElectricMachinery();
}
@Override
public Energy produceEnergy() {
return new Battery();
}
}
10. FactoryMethodMain 客戶(hù)端
/**
* 客戶(hù)端
*/
public class AbstractFactoryMain {
public static void main(String[] args) {
System.out.println("電動(dòng)汽車(chē)使用電動(dòng)機(jī)和電池");
VehicleFactory eletricVehicleFactory = new ElectricVehicleFactory();
eletricVehicleFactory.produceEngine().start();
eletricVehicleFactory.produceEnergy().burn();
System.out.println("-------------------分割線-----------------------");
System.out.println("汽油車(chē)使用汽油發(fā)動(dòng)機(jī)和汽油");
VehicleFactory gasVehicleFactory = new GasVehicleFactory();
gasVehicleFactory.produceEngine().start();
gasVehicleFactory.produceEnergy().burn();
}
}
3. 抽象工廠模式總結(jié)
在抽象工廠模式中,產(chǎn)品族是大于等于2的;并且同一族的產(chǎn)品要在一起使用。示例中的電動(dòng)機(jī)和電池、汽油發(fā)動(dòng)機(jī)和汽油就是這樣的關(guān)系。
抽象工廠和所有的工廠方法一樣,客戶(hù)端不知道產(chǎn)品實(shí)例創(chuàng)建的細(xì)節(jié),客戶(hù)端只依賴(lài)于產(chǎn)品的抽象。
優(yōu)點(diǎn)
客戶(hù)端使用抽象工廠來(lái)創(chuàng)建需要的對(duì)象,而客戶(hù)端根本就不知道具體的實(shí)現(xiàn)是誰(shuí),客戶(hù)端只是面向產(chǎn)品的接口編程而已。也就是說(shuō),客戶(hù)端從具體的產(chǎn)品實(shí)現(xiàn)中解耦。
切換或者擴(kuò)展產(chǎn)品族變得容易,因?yàn)橐粋€(gè)具體的工廠實(shí)現(xiàn)代表的是一個(gè)產(chǎn)品族,上面的例子里切換電動(dòng)車(chē)和汽油車(chē)很容易,只需要切換具體工廠即可;同時(shí),假如以后出現(xiàn)了核動(dòng)力的引擎,添加核動(dòng)力引擎和核燃料、以及它們對(duì)應(yīng)的具體工廠即可。
缺點(diǎn)
不太容易擴(kuò)展新的產(chǎn)品,例如車(chē)輛還需要變速箱,如果要增加變速箱,那么就需要修改抽象工廠,這樣就會(huì)導(dǎo)致修改所有的工廠實(shí)現(xiàn)類(lèi)。
題外話。
在中國(guó),電動(dòng)汽車(chē)是大勢(shì)所趨,這是由中國(guó)的能源結(jié)構(gòu)和價(jià)格決定的。美國(guó)能源以石油為主,儲(chǔ)量和產(chǎn)量都大,價(jià)格低;中國(guó)的能源以電為主(煤電、水電、太陽(yáng)能、核電),并且有世界上最先進(jìn)的電網(wǎng)。在中國(guó),單位能量的電價(jià)要比油價(jià)便宜很多,是以政府會(huì)力推新能源汽車(chē)。因此,如果你身在搖號(hào)的大城市,在當(dāng)前電車(chē)車(chē)牌更容易獲取的時(shí)候,拿到一塊拍照,是有遠(yuǎn)見(jiàn)的。當(dāng)電池技術(shù)成熟了,獲取車(chē)牌的成本就會(huì)大幅提高。
(完)