Android中的設計模式-抽象工廠模式

抽象工廠模式(Abstract Factory)

先上類圖吧,自己懶得畫了,找了個現成的
這裏寫圖片描述
抽象工廠的引入是根據需求而產生的,說到這裏先要提到一個名字—產品族(Product Family),還是以生產汽車爲例,我想要一個上汽的汽車工廠能夠同時生產一款MPV,一款SUV和一款Sedan,那比如說它就是上海通用別克的工廠啦,可以生產MPV GL8,生產SUV 昂科威,可以生產Sedan 君威,這幾款產品就算是一個產品族。作爲公司高層,肯定是希望工廠能夠有能力同時生產這三款車,將這個工程抽象出來,就成了這個樣子:

public interface AbstractFactory {
    public SUV makeSUV();
    public MPV makeMPV();
    public Sedan makeSedan();
}

不過這個例子並不好,因爲這裏的三種車輛還是屬於車輛,而產品族,是指不同的產品,這裏還是換一個例子來說明吧。

生產一個SUV,需要生產不同的零件,如輪胎,方向盤,發動機。該款SUV上的Tyre, SteeringWheel和Engine,則屬於一個產品族,一個SUV對象需要Tyre, SteeringWheel和Engine的實例才能正常工作。如果在SUV的類中,直接調用新建三種對象,當然是沒有問題的。問題出在,如果換一款SUV,輪胎,方向盤,發動機都變了,那我們就得重新新建TyreB, SteeringWheelB和EngineB. 爲了讓SUV更加通用,可以抽象出Tyre, SteeringWheel和Engine三個接口,然後實現不同的Tyre, SteeringWheel和Engine產品。 同時針對SUVA和SUVB兩種SUV。創建一個Creater接口,接口中定義了創建3中產品的方法。而在Creater接口的具體實現類中,則實現三種產品不同型號的創建。

我們抽象出來的類圖如下所示:

類圖

這裏寫圖片描述

代碼:

三種產品

interface Tyre {
    public void Roll();
}


class TyreA implements Tyre{
    @Override
    public void Roll() {
            System.out.println("I am TyreA ,I am Big");
    }

}
class TyreB implements Tyre{
    @Override
    public void Roll() {
        System.out.println("I am TyreB ,I am Small");
    }

}

interface SteeringWheel{
    public void Turn();
}

class SteeringWheelA implements SteeringWheel{
    @Override
    public void Turn() {
        System.out.println("I am SteeringWheelA ,I am Big");
    }

}
class SteeringWheelB implements SteeringWheel{
    @Override
    public void Turn() {
        System.out.println("I am SteeringWheelB ,I am Small");
    }

}
interface Engine{
    public void Roar();
}

class EngineA implements Engine{
    @Override
    public void Roar() {
        System.out.println("I am EngineA ,I am 3.0Turbo ");
    }
}

class EngineB implements Engine{
    @Override
    public void Roar() {
        System.out.println("I am EngineB ,I am 1.6L ");
    }
}

兩個工廠


public interface AbstractFactory {
    public Tyre createTyre();
    public SteeringWheel createSteeringWheel();
    public Engine createEnginen();
}


class SUVFactory1 implements AbstractFactory{

    @Override
    public Tyre createTyre() {
        return new TyreA();
    }

    @Override
    public SteeringWheel createSteeringWheel() {
        return new SteeringWheelA();
    }

    @Override
    public Engine createEnginen() {
        return new EngineA();
    }

}

class SUVFactory2 implements AbstractFactory{

    @Override
    public Tyre createTyre() {
        return new TyreB();
    }

    @Override
    public SteeringWheel createSteeringWheel() {
        return new SteeringWheelB();
    }

    @Override
    public Engine createEnginen() {
        return new EngineB();
    }

}

使用工廠1創建的SUV

public class SUV {
    public Tyre mTyre;
    public SteeringWheel mSteeringWheel;
    public Engine mEngine;
    public AbstractFactory mFactory;
    public SUV() {
        mFactory=new SUVFactory1();
        mTyre=mFactory.createTyre();
        mSteeringWheel=mFactory.createSteeringWheel();
        mEngine=mFactory.createEnginen();
    }

    public void show(){
        mTyre.Roll();
        mSteeringWheel.Turn();
        mEngine.Roar();
    }
}

測試類

public class Host {

    public static void main(String[] args) {
        SUV mSUV=new SUV();
        mSUV.show();
    }

}

輸出:

I am TyreA ,I am Big
I am SteeringWheelA ,I am Big
I am EngineA ,I am 3.0Turbo 

這時如果需要創建另一款SmallSUV車型,只需要創建另一個SmallSUV類,並新建第二個工廠,生產另外小型號的三種產品。

public class SmallSUV {
    public Tyre mTyre;
    public SteeringWheel mSteeringWheel;
    public Engine mEngine;
    public AbstractFactory mFactory;
    public SmallSUV() {
        mFactory=new SUVFactory2();
        mTyre=mFactory.createTyre();
        mSteeringWheel=mFactory.createSteeringWheel();
        mEngine=mFactory.createEnginen();
    }
    public void show(){
        mTyre.Roll();
        mSteeringWheel.Turn();
        mEngine.Roar();
    }
}

測試類

public class Host {
    public static void main(String[] args) {
        SmallSUV mSUV=new SmallSUV();
        mSUV.show();
    }
}

輸出

I am TyreB ,I am Small
I am SteeringWheelB ,I am Small
I am EngineB ,I am 1.6L 

Android中的抽象工廠

暫時沒遇到,歡迎知道的童鞋告知在下,先行謝過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章