設計模式系列9---和而不同的工廠方法模式

現在的手機製造業,在高度的繁榮發展後,流水線的工作基礎,吸引了很多廠商爲了壓低成本,搞一些odm的手機,就是在一個模版的基礎上,改下殼,換個商標的樣子,就開發佈會,說有新的手機!大家快帶上你的錢來買,賣得好不好,純靠營銷能力啊。

例如下面的,某情懷和某米的手機,是不是很一樣啊?
改一改又是一部手機!

enter image description here enter image description here

那麼,作爲工廠,應該怎麼搞呢?

代碼實現

我們設計出這個工廠的基本方法

 public class PhoneFactory {

    public static SmartPhone createSmartPhone(Class c){
        SmartPhone phone=null; 
        try {
            phone = (SmartPhone)Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            System.out.println("必須指定手機牌子");
        } catch (IllegalAccessException e) {
            System.out.println("手機定義錯誤");
        } catch (ClassNotFoundException e) {
            System.out.println("沒這牌子手機");
        }
        return phone;
    }

}

我們的工廠蓋好了,很簡單,就是造部手機出來!

 public  abstract class  SmartPhone{

    public abstract void showBrand();
    public abstract void startUp();
    public abstract void shutDown();
}

接着我們的工廠提供了一個公模,所有的基礎的模版,如果需要定製手機,就在這基礎上修改下,我們的智能手機當然啦,很智能,能開機,關機,展示品牌,厲害吧

現在時候來展示我們的手機了,我們的各個大品牌商要開發佈會,重新定義手機了,是的,重新定義手機,很牛逼哄哄的!!

先來下我們的革命級別的大米手機:

 public  class  MiPhone extends SmartPhone{

    @Override
    public void showBrand() {
        System.out.println(" 這個是大米手機");
    }

    @Override
    public void startUp() {
        System.out.println(" 大米手機正在開機");
    }

    @Override
    public void shutDown() {

        System.out.println("大米正在關機");
    }
}

接着是我們的極具情懷的東半球可能是最厲害的大錘子手機

public  class  HammerPhone extends SmartPhone{

    @Override
    public void showBrand() {
        System.out.println(" 這個是大錘子手機");
    }

    @Override
    public void startUp() {
        System.out.println(" 大錘子手機正在開機");
    }

    @Override
    public void shutDown() {

        System.out.println("大錘子正在關機");
    }
}

有了這些基礎,我們的各種發佈會就可以如期舉行,只需要督促下我們各個工廠,叫他們加大馬力,趕緊生產,產不出來的我們就飢餓營銷下。

現在我們來看下,我們到底怎麼生產手機

public  void main(String[] args) {

    SmartPhone smartPhone=PhoneFactory.createSmartPhone(MiPhone.class);

    smartPhone.startUp();
    smartPhone.showBrand();
    smartPhone.shutDown();
}

我們的智能手機就這樣生產出來了!是不是很好的感覺?

以後別的手機友商,如果需要生產新的手機,就繼承下,然後改下牌子名,就可以拿出去賣了,是不是很好!!!!!

另外如果要搞庫存,保留模版,可以弄一個靜態的存儲!
這樣初始化就能降低消耗了。

public static SmartPhone createSmartPhone(Class c) {
        SmartPhone phone = null;
        try {
            if (storePhone.containsKey(c.getSimpleName())) {
                phone = storePhone.get(c.getSimpleName());
            } else {
                phone = (SmartPhone) Class.forName(c.getName()).newInstance();
                storePhone.put(c.getSimpleName(), phone);
            }

        } catch (InstantiationException e) {
            System.out.println("必須指定手機牌子");
        } catch (IllegalAccessException e) {
            System.out.println("手機定義錯誤");
        } catch (ClassNotFoundException e) {
            System.out.println("沒這牌子手機");
        }
        return phone;
    }

}

類圖

enter image description here
我們看下我們的工廠方法的類圖,是不是很靈活的樣子!
我們只需要修改傳遞過去的手機類型,就可以開始生產手機了!

後記

寫到這個鐘頭,都忘記好吃午飯了,寫完突然覺得好餓啊。。

前面的是簡單定製的案例,不過現實可能會需要點複雜的,高度定製的手機,例如那個高逼格的某果手機。曾經爲了加上藍玻璃屏幕,找了一家供應商,別人知道了這事,他股票大漲,但這家供應商的工藝跟不上,沒做出來他們需要的玻璃,結果股票大跌,倒閉了,哀傷的故事啊。

對於高度定製的工廠,我們也可以在原有的基礎上加點修改,從而達到想要的效果的。
那是抽象工廠方法模型,下次寫,歡迎關注。

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