Java設計模式之工廠模式(Factory)

總李寫程式碼發表於2016-05-30

前言:

     前面學習了建造者設計模式,接下來學習一下Retrofit中使用的另外一個設計模式,工廠設計模式!!!裡面採用工廠模式使得資料轉換得到完全解耦,工廠模式的好處用到了極致,如此好的設計模式我們怎能不學習一下。

工廠模式:

      工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來,達到提高靈活性的目的。 

  1.)工廠模式分類:
  • 簡單工廠模式(Simple Factory) 
  • 工廠方法模式(Factory Method) 
  • 抽象工廠模式(Abstract Factory)
   2.)簡單工廠模式

       見名知意,簡單的工廠模式,建立一個工廠來製造新的物件,又叫靜態工廠。舉例說明李先生去4s店要買一部轎車, 如何實現? 

   1. 首先4s簽單一部車Car

public class Car {

    public Car() {
        Log.e("car", "Car---->我要買車");
    }

}

    2.然後4s店通知CarFactory 工廠生產

public class CarFactory {

    public static Car createCar() {
        return new Car();
    }

}

    3.最後按時生產完畢的話將交付給李先生

 Car car = CarFactory.buildCar();

     整個過程李先生一點不清楚整個轎車的製造過程的情況買到一輛車,通過工廠模式 使得需求和實現解耦。由於工人放假,4s店沒有按時交車導致違約,再加上李先生是個多變的人執意退車,而且選擇不買轎車了,要買一輛suv,這可急死了銷售顧問小王,

接下來小王是怎麼留住李先生的呢?

   4.銷售趕緊通知工廠改造生產線能夠支援生產多種車型,涵蓋轎車、Suv、Mpv等

public class CarFactory {

    public enum CarType {
        SUV,//多功能越野車
        MPV//多功能商務車
    }

    public static Car createCar() {
        return new Car();
    }

    public static Car createCar(CarType type) {
        Car car = null;
        switch (type) {
            case SUV:
                car = new SuvCar();
                break;
            case MPV:
                car = new MpvCar();
                break;
            default:
                car = new Car();
                break;
        }
        return car;
    }
}

 SuvCar

public class SuvCar extends Car {

    public SuvCar() {
        Log.e("car", "SuvCar---->Suv");
    }
}

MpvCar

public class MpvCar extends Car {

    public MpvCar() {
        Log.e("car", "MpvCar---->Mpv");
    }
}

5. 最終4s按時交付了李先生的suv

 Car suvCar = CarFactory.createCar(CarFactory.CarType.SUV);

    改造工廠之後銷售顧問小王的業績蒸蒸日上,但是好景不長,問題又來了,由於在同一個工廠開發不同的車型導致管理混亂,質量嚴重不過關,工廠還進行了大量召回和賠償。接下來公司決定對工廠進行整改。如何整改接下來我們來看工廠方法模式 

3.)工廠方法模式 

     通過上面的簡單工廠模式可以看出,其實簡單的工廠模式看似用來簡單,但是不利於擴充套件和維護,稍有不慎就有很大的麻煩,鑑於這個原因我們來看下工廠方法模式,工廠方法為工廠類定義了介面或者抽象類,用多型來分配每個子工廠類的職能,還是接著上面的例子來說明。

   1.工廠老闆重新定義了公司產品物件就是造車

public interface ICarFactory {

    //造車
    Car createCar();
}

   2.整理產品線,建造兩大整車廠分別生產suv、mpv車型

SuvCarFactory 
public class SuvCarFactory implements ICarFactory{
    @Override
    public Car createCar() {
        return new SuvCar();
    }
}
MpvCarFactory
public class MpvCarFactory implements ICarFactory{
    @Override
    public Car createCar() {
        return new MpvCar();
    }
}

 3.這樣就可以滿足不同的使用者

        SuvCarFactory suvCarFactory = new SuvCarFactory();
        Car suvCar = suvCarFactory.createCar();
        
        MpvCarFactory mpvCarFactory=new MpvCarFactory();
        Car mpvCar=mpvCarFactory.createCar();
4.)抽象工廠方法

      抽象工廠:意的意圖在於建立一系列互相關聯或互相依賴的物件,還是接著上面的例子舉例說明,由於車市不景氣,國家出臺了1.6排量及以下的購置稅減半,工廠決定一輛suv出兩個版本 一個200T一個300T該如何解決呢?這裡就用到抽象工廠方法。

 1.宣佈調整工廠生產產品物件

public interface AbstractCarFactory {

    //製造傳送機
    Engine createEngine();

    //造車
    Car createCar();

}
Engine類
public class Engine {

    public Engine() {
        Log.e("Engine", "Engine---->我是傳送機");
    }
}
Engine200T類
public class Engine200T extends Engine {

    public Engine200T(){
        Log.e("Engine", "Engine---->我是200T發動機");
    }
}
Engine300T類同上

2.調整產品線以suv200T 、suv300T舉例

public class SuvCar200TFactory implements AbstractCarFactory {
    @Override
    public Engine createEngine() {
        return new Engine200T();
    }

    @Override
    public Car createCar() {
        return new SuvCar();
    }
}

    300T同上不再寫

  3.產品輸出

  SuvCar200TFactory suvCar200TFactory =new SuvCar200TFactory();
        suvCar200TFactory.createEngine();
        suvCar200TFactory.createCar();

從舉例可以看出工廠方法和工廠抽象的區別在於工廠抽象實現了一系列有關聯產品的建立。

 

   

 

 

  

相關文章