接上文抽象工廠 模式模式講解,本文主要從具體示例來(lái)復(fù)現(xiàn)該設(shè)計(jì)模式:
由上文可知,抽象工廠模式的UML圖如下:

image.png
【1】情景假設(shè):
假設(shè)現(xiàn)在有一個(gè)奧迪造車(chē)工廠,生產(chǎn)的車(chē)系有Q3,Q5,Q7三種不同型號(hào)但同屬于Q系列的轎車(chē),雖然同屬于Q系列轎車(chē),但三者車(chē)型的零部件差別還是很大,比如Q3和Q7對(duì)比,Q3使用的發(fā)動(dòng)機(jī)是國(guó)產(chǎn)的,Q7使用的是原裝進(jìn)口,Q3使用的輪胎是普通輪胎,Q7使用的是全尺寸越野輪胎,Q3使用的是比較普通的制動(dòng)系統(tǒng),而Q7使用的是制動(dòng)性能杠杠的制動(dòng)系統(tǒng)。Q3和Q7對(duì)應(yīng)的是一系列車(chē),而發(fā)動(dòng)機(jī),輪胎,制動(dòng)系統(tǒng)則對(duì)應(yīng)的是一系列的零部件,兩者是兩種不同的產(chǎn)品類型,上文說(shuō)過(guò),抽象工廠的定義是為創(chuàng)建一組相關(guān)或者相互依賴的對(duì)象提供一個(gè)接口,而不需要指定它們的具體實(shí)現(xiàn)類。結(jié)合該情景,我們可以使用抽象工廠模式。
具體示例UML圖:

image.png
1)首先,汽車(chē)工廠需要生產(chǎn)發(fā)動(dòng)機(jī),輪胎,制動(dòng)系統(tǒng)這3種零部件。
抽象汽車(chē)工廠類:
package com.company.designModel.sample;
/**
* @ClassName CarFactory
* @Description 抽象汽車(chē)工廠類
* @Author lm
* @Date 2018/9/14 0014 11:16
* @Version 1.0
**/
public abstract class CarFactory {
/**
* 生產(chǎn)輪胎
* return 生產(chǎn)輪胎
*/
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();
}
2)其次,為每種零部件定義一個(gè)接口,并分別創(chuàng)建兩個(gè)不同的實(shí)現(xiàn)類表示不同的零部件。
輪胎接口:
package com.company.designModel.sample;
/**
* 輪胎相關(guān)類
*/
public interface ITire {
void tire();
}
輪胎接口實(shí)現(xiàn)類1:
package com.company.designModel.sample;
/**
* @ClassName NormalTire
* @Description 普通輪胎類
* @Author lm
* @Date 2018/9/14 0014 11:23
* @Version 1.0
**/
public class NormalTire implements ITire{
@Override
public void tire() {
System.out.println("normal tire");
}
}
輪胎接口實(shí)現(xiàn)類2:
package com.company.designModel.sample;
/**
* @ClassName SUVTire
* @Description SUV輪胎類
* @Author lm
* @Date 2018/9/14 0014 11:23
* @Version 1.0
**/
public class SUVTire implements ITire{
@Override
public void tire() {
System.out.println("SUV tire");
}
}
發(fā)動(dòng)機(jī)接口:
package com.company.designModel.sample;
/**
* 發(fā)動(dòng)機(jī)相關(guān)類
*/
public interface IEngine {
void engine();
}
發(fā)動(dòng)機(jī)接口實(shí)現(xiàn)類1:
package com.company.designModel.sample;
/**
* @ClassName DomesticEngine
* @Description 國(guó)產(chǎn)發(fā)動(dòng)機(jī)
* @Author lm
* @Date 2018/9/14 0014 11:23
* @Version 1.0
**/
public class DomesticEngine implements IEngine{
@Override
public void engine() {
System.out.println("domestic engine");
}
}
發(fā)動(dòng)機(jī)接口實(shí)現(xiàn)類2:
package com.company.designModel.sample;
/**
* @ClassName ImportEngine
* @Description 進(jìn)口發(fā)動(dòng)機(jī)
* @Author lm
* @Date 2018/9/14 0014 11:23
* @Version 1.0
**/
public class ImportEngine implements IEngine{
@Override
public void engine() {
System.out.println("Import engine");
}
}
制動(dòng)系統(tǒng)接口:
package com.company.designModel.sample;
/**
* 制動(dòng)系統(tǒng)相關(guān)類
*/
public interface IBrake {
void brake();
}
制動(dòng)系統(tǒng)接口實(shí)現(xiàn)類1:
package com.company.designModel.sample;
/**
* @ClassName NormalBrake
* @Description 普通發(fā)動(dòng)機(jī)
* @Author lm
* @Date 2018/9/14 0014 11:27
* @Version 1.0
**/
public class NormalBrake implements IBrake{
@Override
public void brake() {
System.out.println("Normal Brake");
}
}
制動(dòng)系統(tǒng)接口實(shí)現(xiàn)類2:
package com.company.designModel.sample;
/**
* @ClassName SeniorBrake
* @Description 高級(jí)發(fā)動(dòng)機(jī)
* @Author lm
* @Date 2018/9/14 0014 11:27
* @Version 1.0
**/
public class SeniorBrake implements IBrake{
@Override
public void brake() {
System.out.println("Senior Brake");
}
}
3)然后,對(duì)于具體生產(chǎn)工廠Q3,Q7,生產(chǎn)的零部件均不相同。
具體生產(chǎn)工廠Q3Factory:
package com.company.designModel.sample;
/**
* @ClassName Q3Factory
* @Description 具體生產(chǎn)工廠類Q3
* @Author lm
* @Date 2018/9/14 0014 11:32
* @Version 1.0
**/
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
具體生產(chǎn)工廠Q7Factory:
package com.company.designModel.sample;
/**
* @ClassName Q7Factory
* @Description 具體生產(chǎn)工廠類Q7
* @Author lm
* @Date 2018/9/14 0014 11:33
* @Version 1.0
**/
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}
4)最后,在客戶端的具體實(shí)現(xiàn)。
客戶端:
package com.company.designModel.sample;
/**
* @ClassName Client
* @Description 客戶端具體實(shí)現(xiàn)
* @Author lm
* @Date 2018/9/14 0014 11:34
* @Version 1.0
**/
public class Client {
public static void main(String[] args) {
//構(gòu)造一個(gè)生產(chǎn)Q3的工廠
CarFactory Q3Factory = new Q3Factory();
Q3Factory.createTire().tire();
Q3Factory.createEngine().engine();
Q3Factory.createBrake().brake();
System.out.println("===================");
//構(gòu)造一個(gè)生產(chǎn)Q7的工廠
CarFactory Q7Factory = new Q7Factory();
Q7Factory.createTire().tire();
Q7Factory.createEngine().engine();
Q7Factory.createBrake().brake();
}
}
輸出結(jié)果:
normal tire
domestic engine
Normal Brake
===================
SUV tire
Import engine
Senior Brake
【2】示例小結(jié):
示例中我們模擬了只有具體工廠類,而如果此時(shí)需要增加一個(gè)Q5Factory類,,那么需要增加對(duì)應(yīng)Q5Factory類的輪胎,發(fā)動(dòng)機(jī),制動(dòng)系統(tǒng)類,可以看出,隨著具體工廠的增加,類的數(shù)目會(huì)成倍增加,因此在實(shí)際工作中需要控制具體工廠的數(shù)目,保持設(shè)計(jì)模式的簡(jiǎn)潔性。