合工大很牛很牛牛

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks


          緊接著上一篇隨筆介紹Simple Factory,如果我們需要create各種各樣的Pizza,我們可以在PizzaFactory里面的factoryPizzaCreation( )內
          寫上無數的if...else if...。當然也可以分門別類,用不同的PizzaFactory構造不同系列的Pizza,如下:







          注意:因為XXFactory很多,我們用一個class family來實現它們之間的復用,考慮到調用的時候會有許多if...else if...語句來判斷
          具體用哪個XXFactory(來生成Pizza),所以又設計了一個FacFac類,用它的factoryCreation方法來專門生成相應的XXFactory,
          這個類相當于“工廠的工廠”。

          這樣,FacFac和AbstFactory的子類封裝了變化的部分(前者是封裝XXFactory的變化,后者封裝XXPizza的變化),
          其他的類都可以保持穩定。

          下面是用NYFactory來生成一個NYCheesePizza的時序圖:



          主要實現代碼如下:
           1package SimpleFactory;
           2
           3public class PizzaStore
           4{
           5
           6    AbstFactory mAbstFactory;
           7    Pizza mPizza;
           8    FacFac mFacfac = new FacFac(); //FacFac是專門用于生產XXPizzaFactory的Factory
           9
          10
          11    public Pizza createPizza(String pizzaName, String pizzaFactory)
          12    {
          13
          14        mAbstFactory = mFacfac.factoryCreation(pizzaFactory);
          15        mPizza = mAbstFactory.factoryPizzaCreation(pizzaName);
          16        return mPizza;
          17    }

          18
          19    public Pizza orderPizza()
          20    {
          21        mPizza.prepare();
          22        mPizza.bake();
          23        mPizza.cut();
          24        mPizza.box();
          25        return mPizza;
          26    }

          27}

          28

          package SimpleFactory;

          public class FacFac
          {

              AbstFactory mFactory;

              
          public AbstFactory factoryCreation(String factoryName)
              
          {
                  
          if (factoryName.equals("NYFactory"))
                  
          {
                      mFactory 
          = new NYFactory();
                      System.out.println(
          "New York Factory demanded");
                      
          return mFactory;
                  }

                  
          else if (factoryName.equals("ChiFactory"))
                  
          {
                      mFactory 
          = new ChiFactory();
                      System.out.println(
          "Chicago Factory demanded");
                  }

                  
          return null;

              }

          }


           1package SimpleFactory;
           2
           3public class NYFactory extends AbstFactory
           4{
           5
           6    Pizza mPizza;
           7
           8    @Override
           9    public Pizza factoryPizzaCreation(String pizzaName)
          10    {
          11        if (pizzaName.equals("NYCheesePizza"))
          12        {
          13            mPizza = new NYCheesePizza();
          14            System.out.println("NYCheesePizza created");
          15            return mPizza;
          16        }

          17        else if (pizzaName.equals("NYClamPizza"))
          18        {
          19            mPizza = new NYClamPizza();
          20            System.out.println("NYClamPizza created");
          21            return mPizza;
          22        }

          23        return null;
          24    }

          25}

          26

           1package SimpleFactory;
           2
           3public class Pizza
           4{
           5
           6    public void prepare()
           7    {
           8        System.out.println("Pizza prepared");
           9    }

          10
          11    public void bake()
          12    {
          13        System.out.println("Pizza baked");
          14    }

          15
          16    public void cut()
          17    {
          18        System.out.println("Pizza cut");
          19    }

          20
          21    public void box()
          22    {
          23        System.out.println("Pizza boxed.");
          24    }

          25}

          26


           1package SimpleFactory;
           2
           3public class Main
           4{
           5
           6    public static void main(String[] args)
           7    {
           8        PizzaStore store = new PizzaStore();
           9        store.createPizza("NYClamPizza""NYFactory");
          10        store.orderPizza();
          11    }

          12}

          13


          這個程序,實際上是對簡單工廠思維方式的反復使用。該程序中,設計了兩塊容易產生變化的部分(XXFactory和XXPizza的變化)。
          我們對每一部分都使用了簡單工廠的思維——即把變化的部分抽象出來,用一個“工廠類”中的XXCreation方法來單獨實現這段維護時
          容易產生變化的代碼。

          在簡單工廠中,每抽象一次變化的部分,就在需要保持穩定的類和新增的控制變化的類之間產生了一個Association。


          posted on 2008-05-21 19:22 化的了 閱讀(1106) 評論(1)  編輯  收藏 所屬分類: 設計模式

          Feedback

          # re: 簡單工廠續 simple factory furthermore 2008-05-22 10:32 護航
          能簡單介紹這幾種工廠模式的差別嗎?向您學習  回復  更多評論
            

          主站蜘蛛池模板: 韶山市| 花莲县| 平邑县| 屏东县| 乃东县| 扬州市| 崇左市| 弥勒县| 陇川县| 石家庄市| 于都县| 章丘市| 广丰县| 富裕县| 库车县| 泽州县| 翁源县| 光泽县| 天门市| 灌云县| 西吉县| 弋阳县| 清徐县| 遂平县| 成安县| 博罗县| 遵化市| 平顶山市| 通州市| 永福县| 湟源县| 浦江县| 南康市| 盐池县| 海晏县| 岳普湖县| 肃南| 柯坪县| 板桥市| 普格县| 渝中区|