Android 抽象工廠模式
文章目錄
1、抽象工廠模式介紹
抽象工廠模式也是建立型模式之一,抽象工廠模式起源於對不同作業系統的圖形化解決方案,如不同作業系統的按鈕和文字框控制元件及其實現。
2、抽象工廠模式的定義
為建立一組相關或者相互依賴的物件提供介面,而不需要具體指定他們的具體類。
3、抽象工廠模式的使用場景
一個物件有相同的約束時可以使用抽象工廠模式。
4、抽象工廠模式的簡單實現
以車廠為例,Q3, Q5, Q7, 雖然是一個車系,但是兩者之間的零部件差別很大,
1)Q3 發動機 國產 ; Q7 發動機 原裝進口
2)Q3 輪胎 普通輪胎 ; Q7 越野輪胎
3) Q3 比較普通的制動系統 ; Q7 制動性極好的制動系統
Q3 Q7 雖然是 同一種的產品型別,但是發動機 輪胎 制動性 都不一樣,
這時候就使用到了抽象工廠模式,首先工廠需要生產 輪胎 、 發動機 、 制動系統 這三部分元件。
程式碼架構 :
- 先建立一個抽象車廠類 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 原始碼設計模式解析與實戰 第二版
本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。