qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          跟屌絲大哥學習設計模式-抽象工廠模式

          1.3 抽象工廠(Abstract Factory)模式
              抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品具體類型的情況下,創建多個產品族中的產品對象。這就是抽象工廠模式的用意。
              每個模式都是針對一定問題的解決方案。抽象工廠模式面對的問題是多產品等級結構的系統設計。
              在學習抽象工廠具體實例之前,應該明白兩個重要的概念:產品族和產品等級。
              產品族:是指位于不同產品等級結構中,功能相關聯的產品組成的家族。比如AMD的CPU和ADM芯片的主板,組成一個家族。Intel的CPU和 Intel芯片的主板,又組成一個家族。而這兩個家族都來自于兩個產品等級:CPU,主板。一個等級結構是由相同的結構的產品組成,示意圖如下:




              理解這個產品結構是理解抽象工廠模式的關鍵所在,所以我不惜花費時間來畫此圖。如果領悟不到此圖的含義,就無法區分工廠方法模式和抽象工廠模式的區別。
              從上圖可以看出,抽象工廠模式的每個工廠創造出來的都是一族產品,而不是一個或者一組。組是可以隨意組合的!其實兩個就這點點差別,呵呵,估計現在你已經差不多明白了抽象工廠模式的含義。不廢話了,看個例子,真相將大白于天下!
          1.3.1 抽象工廠模式在農場中的實現

          1.3.1.1 背景

              聰明的農場主總是讓自己的莊園越來越有價值,“農場”在經歷了簡單工廠模式和工廠模式后,不斷的擴大生產。如今,再次面臨新的大發展,一項重要的工作就是 引進塑料大棚技術,在大棚里種植熱帶(Tropical)和亞熱帶(Northern)的水果和蔬菜,用以滿足市場需求,獲取更大的利益。

          1.3.1.2 產品角色圖

              經過分析,對產品角色進行分析得出下圖


              經過分析,所謂的各個園丁其實就是工廠角色,而蔬菜和水果則是產品角色。將抽象工廠模式用于農場中,系統設計圖如下:



          1.3.1.4.1 抽象工廠:Gardener.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:Gardener.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:55:23
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  抽象工廠角色:工廠接口
           */
          public interface Gardener {
              public Fruit createFruit(String name);
          1.3.1.4.2 抽象水果產品:Fruit.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:Fruit.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:54:15
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  抽象產品角色:水果接口
           */
          public interface Fruit {
          }
          1.3.1.4.3 抽象蔬菜產品:Veggie.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:Veggie.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:56:22
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  抽象產品角色:蔬菜接口
           */
          public interface Veggie {
          }
          1.3.1.4.4 熱帶水果:TropicalFruit.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:TropicalFruit.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:57:08
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體產品角色:熱帶水果
           */
          public class TropicalFruit implements Fruit {
              private String name;
          }
          1.3.1.4.5 熱帶蔬菜:TropicalVeggie.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:TropicalVeggie.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:58:03
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體產品角色:熱帶蔬菜
           */
          public class TropicalVeggie implements Veggie {
              private String name;
              public TropicalVeggie(String name) {
                  System.out.println("熱帶工廠為您創建了:熱帶水果-"+name);
              }
          }
          1.3.1.4.6 亞熱帶水果:NorthernFruit.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:NorthernFruit.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:58:55
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體產品角色:亞熱帶水果
           */
          public class NorthernFruit implements Fruit {
              private String name;
              public NorthernFruit(String name) {
                  System.out.println("亞熱帶工廠為您創建了:亞熱帶水果-"+name);
              }
          }

          1.3.1.4.7 亞熱帶蔬菜:NorthernVeggie.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:NorthernVeggie.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    22:59:36
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體產品角色:亞熱帶蔬菜
           */
          public class NorthernVeggie implements Veggie {
              private String name;
              public NorthernVeggie(String name) {
                  System.out.println("亞熱帶工廠為您創建了:亞熱帶蔬菜-"+name);
              }
          }
          1.3.1.4.8 熱帶工廠:TropicalGardener.java
          /**
           * Created by IntelliJ IDEA.
           * FileName:TropicalGardener.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    23:01:49
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體工廠角色:熱帶工廠
           */
          public class TropicalGardener implements Gardener {
              public Fruit createFruit(String name) {
                  return new TropicalFruit(name);
              }
              public Veggie createVeggie(String name) {
                  return new TropicalVeggie(name);
              }
          }
          1.3.1.4.9 亞熱帶工廠:NorthernGardener.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:NorthernGardener.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    23:00:31
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  具體工廠角色:亞熱帶工廠
           */
          public class NorthernGardener implements Gardener {
              public Fruit createFruit(String name) {
                  return new NorthernFruit(name);
              }
              public Veggie createVeggie(String name) {
                  return new NorthernVeggie(name);
              }
          }
          1.3.1.4.10 測試類(客戶端):TestApp.java
          package com.lavasoft.patterns.abstractfactory.ybms;
          /**
           * Created by IntelliJ IDEA.
           * FileName:TestApp.java
           * User:    LavaSoft
           * Date:    2006-12-5
           * Time:    23:03:22
           * 《Java與模式》(--閻宏博士著)讀書筆記
           * 工廠模式--抽象工廠模式--一般性模式(農場應用)
           * ReadMe:  測試類(客戶端)
           */
          public class TestApp {
              private void test(){
                  Veggie tv,nv;
                  Fruit tf,nf;
                  TropicalGardener tg=new TropicalGardener();
                  NorthernGardener ng=new NorthernGardener();
                  tv=tg.createVeggie("熱帶菜葉");
                  nv=ng.createVeggie("東北甜菜");
                  tf=tg.createFruit("海南椰子");
                  nf=ng.createFruit("雪梨");
              }
              public static void main(String args[]){
                  TestApp test=new TestApp();
                  test.test();
              }
          }
          1.3.1.4.11 測試運行結果
              熱帶工廠為您創建了:熱帶水果-熱帶菜葉
              亞熱帶工廠為您創建了:亞熱帶蔬菜-東北甜菜
              熱帶工廠為您創建了:熱帶水果-海南椰子
              亞熱帶工廠為您創建了:亞熱帶水果-雪梨
              Process finished with exit code 0
              看完設計圖和源碼,原理已經很清楚了,這個模式應用很靈活,猴交給你了,看你怎么玩它!哈哈哈哈。。。。
          1.3.1.5 女媧舉繩造萬物
              女媧舉繩造物的故事很適合在這里舉例子,女媧的繩子按照陰陽劃分,產品則按人、獸劃分。將抽象工廠模式用于女媧造萬物的模擬系統設計中。系統設計圖如下:

          posted on 2012-12-21 16:26 順其自然EVO 閱讀(682) 評論(0)  編輯  收藏 所屬分類: 設計模式學習

          <2012年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 凤城市| 中江县| 临汾市| 平凉市| 普兰县| 玉山县| 万全县| 武威市| 饶河县| 道孚县| 泾源县| 罗城| 齐齐哈尔市| 合水县| 东安县| 巴南区| 五指山市| 阆中市| 沂南县| 龙泉市| 翁牛特旗| 伊金霍洛旗| 宝坻区| 阿尔山市| 丰宁| 犍为县| 紫金县| 呼和浩特市| 德安县| 伊通| 霞浦县| 碌曲县| 瑞安市| 平果县| 深水埗区| 封开县| 澄城县| 辛集市| 怀安县| 黑龙江省| 孝感市|