合工大很牛很牛牛

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks
          Factory Methord的目的就是在“封裝對象的創建”的基礎上(simple factory, factory methord, abstract factory的前提都是封裝對象的創建),讓子類來決定對象被如何創建。對比simple factory 是用一個與之assciation的新造的類來專門決定對象該如何被創建,具體見前文《簡單工廠》。

          仍然是用PizzaStore為例:注意下面的PizzaStore中的createPizza()方法是抽象方法,執行過程有子類來決定!而PizzaStore也因此而是抽象類。



          通過NYPizzaStore來創建一個NYCheesePizza的時序圖如下:



          具體代碼如下:
           1package javaapplication18;
           2
           3public class Main
           4{
           5
           6    public static void main(String[] args)
           7    {
           8        PiszzaStore store = new NYPizzaStore();
           9        store.createPizza("CheesePizza");
          10        store.orderPizza();
          11    }

          12}

          13

           1package javaapplication18;
           2
           3public abstract class PiszzaStore
           4{
           5
           6    Pizza mPizza;
           7
           8    public PiszzaStore()
           9    {
          10    }

          11
          12    public abstract Pizza createPizza(String pizzaName);
          13
          14    public Pizza orderPizza()
          15    {
          16        mPizza.prepare();
          17        mPizza.bake();
          18        mPizza.cut();
          19        mPizza.box();
          20        return mPizza;
          21    }

          22}

          23
          24

           1package javaapplication18;
           2
           3public class NYPizzaStore extends PiszzaStore
           4{
           5
           6    public NYPizzaStore()
           7    {
           8    }

           9
          10    public Pizza createPizza(String pizzaName)
          11    {
          12        if (pizzaName.equals("CheesePizza"))
          13        {
          14            mPizza = new NYCheesePizza();
          15            System.out.println("NY CheesePizza created.");
          16            return mPizza;
          17        }

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

          24        return null;
          25    }

          26}

          27
          28

           1package javaapplication18;
           2
           3public class Pizza
           4{
           5
           6    public Pizza()
           7    {
           8    }

           9
          10    public void prepare()
          11    {
          12        System.out.println("pizza prepared");
          13    }

          14
          15    public void bake()
          16    {
          17        System.out.println("pizza baked");
          18    }

          19
          20    public void cut()
          21    {
          22        System.out.println("pizza cut");
          23    }

          24
          25    public void box()
          26    {
          27        System.out.println("pizza boxed");
          28    }

          29}

          30
          31



          事實上,所謂的Factory Methord講白了就是:有些事情,父類故意不干事,讓給子類去干。
          簡化的UML如下:

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

          Feedback

          # re: 工廠方法 Factory Methord 2008-05-21 23:46 Anchor
          你好!很高興看到你的這篇文章..最近也在學這個東東..希望能共同學習..共同交流..我的QQ是494229399  回復  更多評論
            

          # re: 工廠方法 Factory Methord 2008-05-22 08:53 ehuan
          為什么用的是抽象類,而不是接口?有什么好處嗎?
          一般書上都是建議用接口,或者再讓抽象類繼承接口。  回復  更多評論
            

          # re: 工廠方法 Factory Methord[未登錄] 2008-05-22 10:37 stone7
          請問你的UML圖用什么工具畫的?  回復  更多評論
            

          # re: 工廠方法 Factory Methord 2008-05-22 15:19 化的了
          @ehuan
          接口在英文是interface,其實在設計模式里,java中的abstract class和 interface 都是一種抽象方式。
          《head first design pattern》里面把抽象出來的東西都叫做interface,也就說interface是一種方式(把interface理解成為一種概念而不是java的關鍵字),它包括抽象類和接口。

          具體情況時改用抽象類還是接口,要根據上下文環境來決定。因為java里,可以implement多個接口,卻只能extends 一個類。

          中文書有的可能翻譯的不好,或者有的作者就沒明白這個道理,所以把抽象類和接口在設計模式內分得很細

          不曉得我說的話可夠明白。


          @stone7
          uml 是用netbeans里面的uml工具畫的。eclipse的uml2插件實在沒它用的爽。
            回復  更多評論
            

          # re: 工廠方法 Factory Methord[未登錄] 2008-05-22 18:37 apple0668
          nb畫的UML顏色搭配不錯,netbeans很好很強大,做得越來越專業了。  回復  更多評論
            

          # re: 工廠方法 Factory Methord 2008-05-28 18:31 wenlin
          Factory Methord?
          Factory Method  回復  更多評論
            

          # re: 工廠方法 Factory Methord 2008-05-30 18:04 化的了
          @wenlin
          thanks  回復  更多評論
            

          # re: 工廠方法 Factory Method 2008-08-06 16:03 chenlh
          代碼少了
          NYCheesePizza
          NYClamPizza  回復  更多評論
            

          主站蜘蛛池模板: 工布江达县| 抚松县| 舞钢市| 赤水市| 米易县| 西和县| 涿州市| 陵水| 稷山县| 唐山市| 碌曲县| 巫溪县| 怀安县| 平利县| 永川市| 石林| 铅山县| 望都县| 嘉黎县| 吉林省| 岑巩县| 庆安县| 广南县| 黎城县| 鹤山市| 留坝县| 峨边| 二连浩特市| 广南县| 新平| 尤溪县| 三台县| 西藏| 循化| 乾安县| 长宁县| 越西县| 临沧市| 江油市| 汤阴县| 荔波县|