定義
抽象工廠模式(Abstract Factory Pattern)是工廠方法模式的進(jìn)一步抽象,其英文原話"Provide an interface for creating families of related or dependent objects without specifying their concrete classes"。翻譯為以下:
為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口,而不需要指定它們的具體實(shí)現(xiàn)類。
使用場景
一個(gè)對(duì)象族有相同的約束時(shí)可以使用抽象工廠模式。以車廠生產(chǎn)汽車零部件為例,A、B兩家車廠分別生產(chǎn)不同的輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。雖然生產(chǎn)的零件不同,型號(hào)不同。但是根本上都有共同的約束,就是輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。
代碼實(shí)現(xiàn)
輪胎相關(guān)類:
public interface ITire {
/**
* 輪胎
*/
void tire();
}
public class NormalTire implements ITire{
@Override
public void tire() {
System.out.println("普通輪胎");
}
}
public class SUVTire implements ITire{
@Override
public void tire() {
System.out.println("越野輪胎");
}
}
發(fā)動(dòng)機(jī)相關(guān)類:
public interface IEngine {
/**
*發(fā)動(dòng)機(jī)
*/
void engine();
}
public class DomesticEngine implements IEngine{
@Override
public void engine() {
System.out.println("國產(chǎn)發(fā)動(dòng)機(jī)");
}
}
public class ImportEngine implements IEngine{
@Override
public void engine() {
System.out.println("進(jìn)口發(fā)動(dòng)機(jī)");
}
}
制動(dòng)系統(tǒng)相關(guān)類:
public interface IBrake {
/**
*制動(dòng)系統(tǒng)
*/
void brake();
}
public class NormalBrake implements IBrake{
@Override
public void brake() {
System.out.println("普通制動(dòng)");
}
}
public class SeniorBrake implements IBrake{
@Override
public void brake() {
System.out.println("高級(jí)制動(dòng)");
}
}
抽象車廠類:
public abstract class CarFactory {
/**
* 生產(chǎn)輪胎
*
* @return 輪胎
* */
public abstract ITire createTire();
/**
* 生產(chǎn)發(fā)動(dòng)機(jī)
*
* @return 發(fā)動(dòng)機(jī)
* */
public abstract IEngine createEngine();
/**
* 生產(chǎn)制動(dòng)系統(tǒng)
*
* @return 制動(dòng)系統(tǒng)
* */
public abstract IBrake createBrake();
}
A車廠:
public class AFactory extends CarFactory{
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
B車廠:
public class BFactory extends CarFactory{
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}
客戶端:
public class Client {
public static void main(String[] args) {
//A車廠
CarFactory factoryA = new AFactory();
factoryA.createTire().tire();
factoryA.createEngine().engine();
factoryA.createBrake().brake();
System.out.println("---------------");
//B車廠
CarFactory factoryB = new BFactory();
factoryB.createTire().tire();
factoryB.createEngine().engine();
factoryB.createBrake().brake();
}
}
根據(jù)代碼實(shí)現(xiàn)來理解抽象模式的定義:
- "為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口" ,一組相關(guān)對(duì)象是NormalTire、SUVTire,提供一個(gè)接口是ITire;"而不需要指定它們的具體實(shí)現(xiàn)類"是在客戶端使用NormalTire和SUVTire這些類時(shí),不要知道它們是誰。
總結(jié)
抽象工廠模式和工廠方法模式區(qū)別:
抽象工廠模式相對(duì)于工廠方法模式來說,抽象工廠模式每個(gè)具體工廠可以生產(chǎn)一族產(chǎn)品(即多種產(chǎn)品);而工廠方法模式每個(gè)具體工廠只能生產(chǎn)一種產(chǎn)品。當(dāng)產(chǎn)品族中只有一種產(chǎn)品時(shí)抽象工廠模式退化成工廠方法模式。
缺點(diǎn):
- 每增加一個(gè)具體工廠類,并且產(chǎn)品類型有不同,會(huì)導(dǎo)致類文件的成倍增加;
- 不太容易擴(kuò)展新的產(chǎn)品類,因?yàn)槲覀冊(cè)黾右粋€(gè)產(chǎn)品類就需要修改抽象工廠,那么所有的具體工廠類均會(huì)被修改。