合工大很牛很牛牛

            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 護航
          能簡單介紹這幾種工廠模式的差別嗎?向您學習  回復  更多評論
            

          主站蜘蛛池模板: 和静县| 大城县| 科技| 炎陵县| 托克逊县| 武鸣县| 锦屏县| 兰坪| 晋中市| 望都县| 八宿县| 合江县| 安义县| 南京市| 奈曼旗| 申扎县| 广水市| 徐水县| 平顶山市| 九江县| 佛坪县| 山东省| 安西县| 绥江县| 固始县| 广宗县| 南靖县| 灵武市| 河曲县| 大田县| 昭通市| 华亭县| 昌邑市| 连州市| 若尔盖县| 澄江县| 班戈县| 慈利县| 汝阳县| 邳州市| 鄂温|