抽象工廠模式-示例

接上文抽象工廠 模式模式講解,本文主要從具體示例來(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)潔性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 源碼地址 使用場(chǎng)景 一個(gè)對(duì)象族有相同的約束時(shí)可以使用此模式。 例如:Android、iOS 都有短信軟件和撥號(hào)軟件...
    yangMr閱讀 445評(píng)論 0 1
  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,897評(píng)論 0 14
  • 參考 《設(shè)計(jì)模式解析》 第十一章 Abstract Factory模式 《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ) 》3...
    WangGavin閱讀 424評(píng)論 0 1
  • 去年七月和安生席卷而至,我就特別想多看看描寫(xiě)女性題材的電影,懷抱著這個(gè)美好的想法,打開(kāi)了指匠情挑這部迷你劇。后來(lái)發(fā)...
    九月櫻緋閱讀 10,553評(píng)論 0 5
  • 看了今天下了一整天的大雪,才知道昨天的雪真的對(duì)于北方不算什么,倒是不南不北的人的獨(dú)自驚奇了。紛紛揚(yáng)揚(yáng)地下了一...
    柏舟行閱讀 331評(píng)論 0 0

友情鏈接更多精彩內(nèi)容