建立型設計模式——抽象工廠模式

《Android源碼設計模式解析與實戰》讀書筆記(六) 《Android源碼設計模式解析與實戰》PDF資料下載php

1、抽象工廠模式簡介

1.一、定義

爲建立一組相關或者是相互依賴的對象提供一個接口,而不須要指定它們的具體類。編程

1.二、使用場景

一個對象族有相同的約束時可使用抽象工廠模式。 舉個例子: Android、iOS、Window Phone下都有短信軟件和撥號軟件,二者都屬於Software軟件的範疇,可是,他們所在的操做系統平臺不同,即使是同一家公司出品的軟件,其代碼的實現邏輯也是不一樣的,這時候就能夠考慮使用抽象工廠方法模式來產生Android、iOS、Window Phone下的短信軟件和撥號軟件。設計模式

2、抽象工廠方法模式的簡單實現

public abstract class CarFactory {

    /**
     * 生產輪胎
     * @return
     */
    public abstract ITire createTire();

    /**
     * 生產發動機
     * @return
     */
    public abstract IEngine createEngine();

    /**
     * 生產製動系統
     * @return
     */
    public abstract IBrake createBrake();
}
複製代碼

爲每一種零部件產品定義一個接口bash

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("越野輪胎");
    }
}
複製代碼
public interface IEngine {
    /**
     * 發動機
     */
    void engine();
}
複製代碼
public class DomesticEngine implements IEngine {
    @Override
    public void engine() {
        System.out.println("國產發動機");
    }
}
複製代碼
public class ImportEngine implements IEngine {
    @Override
    public void engine() {
        System.out.println("進口發動機");
    }
}
複製代碼
public interface IBrake {
    /**
     * 制動系統
     */
    void brake();
}
複製代碼
public class NormalBrake implements IBrake {
    @Override
    public void brake() {
        System.out.println("普通制動");
    }
}
複製代碼
public class SeniorBrake implements IBrake {
    @Override
    public void brake() {
        System.out.println("高級制動");
    }
}
複製代碼
//Q3工廠類
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();
    }
}
複製代碼
//Q7工廠類
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();
    }
}
複製代碼
//構造一個生產Q3的工廠
CarFactory factoryQ3 = new Q3Factory();
factoryQ3.createTire().tire();
factoryQ3.createEngine().engine();
factoryQ3.createBrake().brake();

System.out.println("-----------------------------------------------------");

CarFactory factoryQ7 = new Q7Factory();
factoryQ7.createTire().tire();
factoryQ7.createEngine().engine();
factoryQ7.createBrake().brake();
複製代碼

輸出以下:微信

抽象工廠.png

3、總結

3.一、優勢

  • 分離接口與實現,客戶端使用抽象工廠來建立須要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已,使其從具體的產品實現中解耦,同時基於接口與實現的分離,使抽象該工廠方法模式在切換產品類時更加靈活、容易。

3.二、缺點

  • 類文件的爆炸性增長
  • 不太容易擴展新的產品類,由於每當增長一個產品類就須要修改抽象工廠,那麼全部的具體工廠類均會被修改。

學海無涯苦做舟

個人微信公衆號
相關文章
相關標籤/搜索