1. 程式人生 > >Android 抽象工廠模式

Android 抽象工廠模式

文章目錄

1、抽象工廠模式介紹

抽象工廠模式也是建立型模式之一,抽象工廠模式起源於對不同作業系統的圖形化解決方案,如不同作業系統的按鈕和文字框控制元件及其實現。

2、抽象工廠模式的定義

為建立一組相關或者相互依賴的物件提供介面,而不需要具體指定他們的具體類。

3、抽象工廠模式的使用場景

一個物件有相同的約束時可以使用抽象工廠模式。

4、抽象工廠模式的簡單實現

以車廠為例,Q3, Q5, Q7, 雖然是一個車系,但是兩者之間的零部件差別很大,
1)Q3 發動機 國產 ; Q7 發動機 原裝進口
2)Q3 輪胎 普通輪胎 ; Q7 越野輪胎
3) Q3 比較普通的制動系統 ; Q7 制動性極好的制動系統

Q3 Q7 雖然是 同一種的產品型別,但是發動機 輪胎 制動性 都不一樣,
這時候就使用到了抽象工廠模式,首先工廠需要生產 輪胎 、 發動機 、 制動系統 這三部分元件。
程式碼架構 :
在這裡插入圖片描述

  1. 先建立一個抽象車廠類 CarFactory

(1)先建立 一個 汽車工廠類,用來生產同型號的汽車,說白了 就是 Q3 Q5 Q7 各自繼承
(2)由於是同類型的車但是 裡面的零件會不同,所以我們把類裡新增 不同的 零件物件 類

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */


//建立一個汽車工廠 抽象一個汽車工廠類
public abstract class CarFactory {
    //生產輪胎
    public abstract  ITire createTire();   //返回 輪胎物件

    //生產發動機
    public abstract  IEngin createEngine();  //返回 發動機物件

    //生產製動系統
    public abstract  IBrake createBrake();  //返回 制動系統 物件

}

這裡我們為每一個零件定義一個介面,並分別建立兩個不同的實現類表示不同的零部件產品

5) 輪胎介面 以及 相關類
(1) 輪胎介面

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public interface ITire {

    //輪胎介面
    void tire();
}

(2)普通輪胎類

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class NormalTire implements  ITire {
    @Override
    public void tire() {
        System.out.println("普通輪胎");
    }
}

(3)越野輪胎類

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class SUVTire implements  ITire {
    @Override
    public void tire() {
        System.out.println("越野輪胎");
    }
}

6)發動機介面 以及相關類
(1)發動機 介面

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public interface IEngin {
    //發動機
    void engine();
}

(2)國產發動機 類

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class DomesticEngin implements  IEngin {
    @Override
    public void engine() {
        System.out.println("國產發動機");
    }
}

(3)進口發動機類

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class ImportEngin implements  IEngin {
    @Override
    public void engine() {
        System.out.println("進口發動機");
    }
}

7)制動系統介面 以及 相關類
(1)制動系統介面

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public interface  IBrake {
    //制動系統
    void  brake();
}

(2)普通的制動系統

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class NormalBrake implements  IBrake {
    @Override
    public void brake() {
        System.out.println("普通制動");
    }
}

(3)高階的制動系統

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */

public class SeniorBrake implements  IBrake {
    @Override
    public void brake() {
        System.out.println("高階制動");
    }
}

8)具體的 不同的生產 車廠 Q3 生產廠

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */


//對於 Q3工廠 使用其他的 零部件不同
public class Q3Factory extends  CarFactory {
    @Override
    public ITire createTire() {
        return new NormalTire();    //返回普通的輪胎類
    }

    @Override
    public IEngin createEngine() {
        return  new DomesticEngin(); //返回國產發動機
    }

    @Override
    public IBrake createBrake() {
        return new NormalBrake(); //返回一般制動
    }
}

9)具體的 不同的生產 車廠 Q7 生產廠

package com.example.lum.abstortefactory;

/**
 * Created by lum on 2018/10/13.
 */


// Q7  車生產類
public class Q7Factory extends CarFactory {
    @Override
    public ITire createTire() {
        return new SUVTire(); //返回SUV 車胎
    }

    @Override
    public IEngin createEngine() {
        return new ImportEngin(); //返回進口輪胎
    }

    @Override
    public IBrake createBrake() {
        return  new SeniorBrake(); //返回高階制動
    }
}

10) 客戶類 具體的例項化呼叫 生產

package com.example.lum.abstortefactory;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //構造一個生產Q3 的工廠
        CarFactory factoryQ3 = new Q3Factory();
        factoryQ3.createTire().tire();
        factoryQ3.createEngine().engine();
        factoryQ3.createBrake().brake();


        //構造一個 生產Q7 的 工廠
        CarFactory factoryQ7 = new Q7Factory();
        factoryQ7.createTire().tire();
        factoryQ7.createEngine().engine();
        factoryQ7.createBrake().brake();
    }
}

最後執行的結果顯示:
在這裡插入圖片描述

可以看出 Q3 Q7 使用的是不同的 零件組裝。

5、小結

1)適用於相同 型別 內部不同方法時 使用
2)不容易擴充套件

文獻參考:
Android 原始碼設計模式解析與實戰 第二版

本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。