設計模式__工廠模式

定義:工廠模式定義了一個接口,讓使用者更簡潔,正確的實例化對象。

用處:工廠模式適合較爲複雜的對象的創建。但是其實工廠模式沒有用的那麼模塊化,我們平時看到的好多源碼就是工廠模式。

例子:在一個產品詳情頁面,一個產品的狀態有好幾種,沒有購買,購買了。。。我們可以用不同的產品來封裝不同的狀態,這樣這些狀太更加整潔,而不是在很多的if-else中凌亂。

  先定義一個狀態的抽象類,來約束子類封裝不同狀態。(這是工廠模式的產品基類)

public abstract class ViewStatus {

    public abstract void setStatus(String statusDes);

}

然後,定義該產品不同的狀態(不同的產品)

public class StatusOne extends ViewStatus {

    @Override
    public void setStatus(String statusDes) {
        System.out.println("沒購買:"+statusDes);
    }

}

購買了的狀態:

public class StatusTwo extends ViewStatus {

    @Override
    public void setStatus(String statusDes) {
        System.out.println("購買:" + statusDes);
    }

}

接下來該工廠基類了

public abstract class Factoy {

    public abstract ViewStatus createStatus();

}

實例化不同的狀態的工廠

/**
 * 沒有購買的工廠
 */
public class StatusOneFactor extends Factoy {

    @Override
    public ViewStatus createStatus() {
        return new StatusOne();
    }
}
/**
 * 購買的狀態
 */
public class StatusTwoFactor extends Factoy {
    @Override
    public ViewStatus createStatus() {
        return new StatusTwo();
    }
}

使用該工廠模式:

        Factoy factoy = new StatusOneFactor();
        ViewStatus statusOne = factoy.createStatus();
        statusOne.setStatus("購買了!");

        Factoy factoy1 = new StatusTwoFactor();
        ViewStatus statusOne1 = factoy1.createStatus();
        statusOne1.setStatus("沒購買!");

總結:實例化需要的狀態工廠,然後取出該狀態,最後去使用就好了。這個例子是多工廠模式,當我們的工廠只需要一個的時候可以簡化工廠模式的父類,做一個靜態工廠。(當然那些只有一個工廠的有點不符合對修改關閉)

工廠模式的優點:

  1. 我們有一堆不同狀態的類需要創建時,我們可以使用工廠模式。因爲他可以很好的封裝這些狀態和封裝創建,使用起來方便。
  2. 可以封裝創建比較麻煩的類,這樣不需要使用者去了解類中的實現。
  3. 符合設計模式規則,對拓展開放最修改關閉。

 案例

     1.安卓中我們的activity,其實就是谷歌工程師已經封裝好的工廠模式,我們只需要每次創建不同的產品,即繼承Activity的不    同頁面。

 public Activity newActivity(ClassLoader cl, String className,
            Intent intent)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        return (Activity)cl.loadClass(className).newInstance();
    }

      其實,就是用反射做的工廠。給frameWork返回我們的不同activity。我們可以將工廠類稍微修改一下,優點就是工廠類不需要對不同產品都去做個工廠類。缺點:反射的缺點,運行較慢。

 public <T extends ViewStatus> T createStatues(Class<T> tClass){
        ViewStatus viewStatus = null;

        try {
            viewStatus= (ViewStatus) Class.forName(tClass.getName()).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return (T)viewStatus;
    }

      2.我們平時每一個activity封裝自己的跳轉方法,既可以減少代碼冗餘,也可以表明該類跳轉需要的不同參數。

 public static void toActivity(Context context){
        Intent intent=new Intent(context,HaAcitivity.class);
        context.startActivity(intent);
    }

      這些都是工廠模式的一種實現。

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