<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的隱式生活(My Implicit Life)

    繼續搞“對象”,玩OO.

    首頁 新隨筆 聯系 聚合 管理
      11 Posts :: 1 Stories :: 39 Comments :: 0 Trackbacks

        說起這個工廠模式,一時還真不知道該如何說起。反正這是我的開發日志,不提理論的東西,理論的東西那里都有,我只想把具體實踐記錄下來給師弟師妹們作個參考,積累點經驗。所有這些文字都是集中講一點――“在什么情況下為什么用某種模式好,為什么好,為什么在那種情況下能想起來用?”。

           研究生院項目中“明顯”使用了“工廠方法模式”。其實在遇到具體問題的時候,即使我們不知道有這個模式存在,我們也肯定會造一個類似的東西出來。但是,肯定沒有書上論述的那么好,那么全面。我想這就是看書的好處吧。

     

    工廠方法出現的必然(我的理解,一個很狹隘并幼稚理的人的理解)

     

           剛開始使用這個東西的時候,只是感覺是單純的一種模式,用于創建需要的對象。

           但是隨著使用和思考的深入,越發發現它給我的啟示不只在于單純的對象創建,而是告訴我應該怎么理解“產品”,怎么得到“產品”,怎么消費“產品”,以至于以后怎么設計“產品”。

           下面這個線索是我對它出現必然性的理解:

    1.         “針對接口編程”

      這是OO世界中經典的規范,不管你主動還是被動,你天天都在用這個東西。

        接口是共性的表示,在對象的世界中,共性和個性的辯證關系是最重要的關系。在萬千的對象中,通過它們之間的共性和個性,可以形成最基本對象層級架構。

    假設我們的討論域中有以下一些對象:“學生”、“大學生”、“小學生”、“中學生”;我們不用細想,學過一天OO的人都可以為這些耳熟能詳的對象們,通過個性和共性的關系得出下面的結構圖。

    o_1.JPG

     

           把這些對象之間的關系定義成這樣是順理成章的。

           下一步肯定是讓客戶端“使用”這個接口啦。也就是如下圖:

     

    o_2.JPG

    2.         接口和具體類的矛盾

    勿庸置疑,我們只希望Client跟接口Student打交道,讓它根本就不知道Student有哪些子類,絕對不希望直接跟它們打交道。

    但這里出現的困難是,接口都是“假”的,都是由具體類upcast的。

    如果Client要使用接口StudentClient中必須會出現下面的代碼:

    Student marco = new Small_Student();

           只要一出現這個代碼,就說明Client不只跟Student打交道了,它知道了Small_Student類,這違反了我們預先的想法。

    3.         找“人”幫我去創建“接口對象”

        從上圖體現出來的結構看,Client只想跟Student打交道的目的是實現不了的了。

           最簡單的方法就是找另外的“幫手”去幫我生成這個“接口對象”。這個幫手它知道“接口對象”的具體類型,但是它為客戶端提供的卻一定是“接口類型”。這就符合我們的要求了。如圖:

    o_3.JPG

        這樣,Client就可以既用到了“Student接口對象”,又不用因為“只有具體類才能創建對象”的規則,而必須對其子類結構有完全的了解。它成功的解決了2中的矛盾。

           而“負責創建具體類對象的任務”全部都落在了這個“幫手”身上,這個“幫手”(Student_Factory)就是工廠模式中的工廠類,更具體的說,它就是“簡單工廠模式”中的“簡單工廠類”。

           我覺得,即使一點都不知道工廠模式,一旦我遇到了2里說的矛盾,我也會用這樣的方法處理。

    4.         這個“幫手”不符合“開-閉原則”

    這個幫手的確不錯了,而且一躍成為系統中最重要的對象了,所有“創建具體類的邏輯”都放進去了,也就是因為重要,萬一掛了不就慘了。

    再者,它不符合“開-閉”原則,我不能在不修改這個幫手的情況下添加任何一個產品。在這個例子中就是,如果那天我有病非要加一個“幼兒園學生”進來,那您就必須修改這個“幫手”的代碼了,這個“幫手”現在就變成Version2(如下圖)了,這個二版的幫手,可以在“代碼”層實現對一版(還沒有添加幼兒園學生之前)的通用,但這種保證在“開-閉”原則看來,還是不夠的,不保險的,它要的是在類的結構上的保證。聲明一下,這是我很感性的理解,不正確的可能性很高。

    o_4.JPG

    5.         讓“幫手”也多態

    這里可以嘗試讓“幫手”也多態一下,這樣“每種學生類創建的任務”都被分派到了多態出來的類中去了。這時,再有新的學生類型加進來,添加一個對應的幫手就可以了。這樣雖然類多了一些,但是符合“開-閉”原則,書上稱之為“工廠方法模式”。如圖:

    o_5.JPG

        假如Client現在要使用一個小學生,代碼如下:

    1        //創建一個小學生工廠類這個幫手
    2        Student_Factory factory = new Small_Student_Factory();
    3        //求助這個幫手,幫我創建一個

    4        Student primaryStudent = factory.produce();
    5        //這時就可以使用這個小學生了,讓它玩玩游戲吧

    6        primaryStudent.playGames();
    7

        在這里還是要強調兩點:

    n         雖然實際上Client的確使用了一個小學生對象(Small_Student),但這里Client也認為它就是Student對象,這里一定要用Student接口來隱藏它的具體類。

    n         另外,卻不需要用Student_Factory這個接口來隱藏它的具體類,因為,Client實際就是通過“選擇它的具體類”這招兒來“選擇創建的學生類型”。這里的Student_Factory更多的功能不是“隱藏”具體類,而是“規范”具體類。

     

    項目實踐

     

           扯淡到此,該聯系我們的項目啦。

           由于是做研究生院的項目,其中巨大的需求就是要讓同學能在網上提交各種申請單,申請退學的,申請轉專業的,申請復學的,申請保留學籍的,除了申請女朋友的外,應有盡有。       對于這些單子,用最最基本OO思維,根據共性個性分析方式,抽象出一個申請單接口,和若干的具體類。

           當然,除了概念上感性上吻合以外,在項目中它們也要“真”的有巨大的共性才行,如都要提交,修改,刪除,審核,打印等功能。

           靠,既然都這樣了,肯定就用一接口規定它了。

           想到這里,加上有了上面的思考,不用說了,就用工廠方法模式啦。

     

    o_6.JPG

        圖中Ent_Shift就是申請單接口。等于前面分析的Student接口。還可以看到有很多具體類,前面例子中是代表各種學生,這里就是代表各種申請單。

           當然,這里還有很多工廠,也就是前面一直叫的“幫手”。

    o_7.JPG

           Bean_Shift就是工廠接口,相當于前面的Student_Factory接口。還有很多的具體類就是生產各種申請單的工廠類。

           下面就是使用“申請單工廠方法模式”的一段客戶端代碼:

     1        //聲明申請單接口
     2        Ent_Shift es = null;
     3        //聲明申請單工廠接口

     4        Bean_Shift bs = null;
     5        //根據傳入的申請單類型數字身成對應的申請單工廠

     6        switch (shiftTypeID) {
     7            case
     Bean_Shift.SHIFT_CHANGETEAAP :
     8                bs = new
     Bean_Shift_CHANGETEAAP();
     9                break
    ;
    10            case
     Bean_Shift.SHIFT_RESERVEAP :
    11                bs = new
     Bean_Shift_RESERVEAP();
    12                break
    ;
    13            case
     Bean_Shift.SHIFT_RENEWAP :
    14                bs = new
     Bean_Shift_RENEWAP();
    15                break
    ;
    16             //省略了別的申請單……………………

    17            default :
    18                this.forwardErr(req, resp, "所選擇的異動類別不存在"
    );
    19        }

    20
    21        try 
    {
    22            //調用工廠接口的生產方法

    23            es = bs.getBlankShift(stuID);
    24
                
    25        }
     catch (Exception e) {
    26            this
    .forwardErr(req, resp, DB_ERROR);
    27        }

    28        //調用單子的提交方法
    29        es.submit(req);
    30
            
    31        //發給頁面去顯示

    32        es.fowrardWithSessionObject(
    33
                    req,
    34
                    resp,
    35
                    Ent_Shift.nameInSessionAndRequest);
    36

     

    升華

     

           個人比較同意《Design Pattern Explained》中作者講的,要用好很多的模式,其中都有一個思路,就是用接口或抽象類來隱藏子類的不同。

           我每當看到這時,老是會被一種思路困擾――“new只能new具體類啊,這咋能隱藏呢,這隱藏還有什么用呢?”。

           作者仿佛也曾經有過我的這個傻B苦惱,它的解決方法就是:根本在使用對象的時候,特別是設計階段,盡量不去想對象是在那里被new的。他認為:反正有了工廠模式后,你總有辦法把他們new出來的。

           所以,我用了工廠模式后更發的啟發是:以后設計的時候不要想一個Client怎么創建一個對象,盡管放心大膽的先繼續想,直接使用就好了。反正最后我還有工廠模式呢。

           因此俺的副標題才是“Ignore how they were created”,呵呵。
                                        MARCO ZHANG 2006年2月16日3:52:10

    posted on 2006-02-16 03:53 marco 閱讀(1396) 評論(9)  編輯  收藏 所屬分類: -=Design Pattern=--=Java Techs=--=Project Experience=-

    Feedback

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-02-16 09:38 飛翔的西瓜
    把你加入我的鏈接了,我會經常來“監督”你的進程的:)  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-02-16 10:49 thekll
    ft~建議增加申請男朋友和女朋友的功能,這樣系統的可用性更強些  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-02-16 13:19 marco
    飛翔的西瓜,我就在此謝大哥您啦。

    我也把你鏈上了。  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-02-18 00:48 王知真
    blog好詳細,呵呵,現在就是希望自己早一點再有一個技術blog,相互交流  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-02-18 21:10 龍卷風
    好文章,不過個人感覺工廠模式不實用
    本來簡單類廠靜態函數可以省下一個new,但工廠模式創建工廠還是需要new出來。
    我喜歡使用利用了反射機制的簡單類廠,既滿足開閉原則也用起來也舒服。  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-03-01 12:10 grakiss
    也許是我認識不夠,但是同樓上一樣的想法,在生成具體的類工廠時仍然會需要去確定它的具體類型,那么所謂的封裝,隱藏不是因此而失效了么?這也正是你自己一開始的想法.雖然你提到可以不用去考慮具體的生成過程,但這不正是使用該模式的關鍵之處嗎,我無法明白不考慮這個的情況下使用類工廠模式的意義.另外對樓上所說的反射機制很感興趣,似乎有另外的實現方法.  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-03-02 14:21 marco
    grakiss,對于客戶端來講,所謂的工廠就是用來封裝“更里面”的“抽象-具體”也就是“接口-具體類”的層級結構,讓客戶端能“只”關注抽象也就是接口。

    所以,換句話講,在工廠方法模式中,對工廠的層級結構中,的確如你所說,是不能隱藏工程的具體類了。

    但是,你再換個思路想想,由這個工廠層級結構,更里面的層級結構,如這個例子中的各種學生的具體類型,真的對于客戶端已經隱藏起來了,而只把抽象的接口暴露給了客戶端。

    所以,從這個角度來講,我們不是要隱藏一切“抽象-具體”的層級結構,而只是部分的,必要的。如上面的工廠就是隱藏不了了。

    不過,也如我上面文章寫的,隱藏不了具體工廠,其實沒有任何壞處。是可以接受的。畢竟我們對于具體產品的制定,在工廠模式中就轉換為對具體工廠的制定。

    -----------------
    再強調,工廠模式的根本目的是“隱藏具體產品,只讓客戶端看到抽象產品”,你再品味一下,呵呵,我的話完了。  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2006-03-02 14:34 marco
    另外,對于你所的,為什么可以在設計中忽略工廠模式這個問題。

    我想說的是,假設你的類設計中,存在大量的接口,抽象類這樣的東西。而且類與類之間,也大部分是通過“這些東西“關聯起來的時候。

    正如你所說,是很難不去考慮,當你真正要用的時候,到底上來的是那個具體類。

    但是,我知道工廠模式肯定最后能幫我解決這個。所以,才暫時忽略,而不是不搞了。等我的設計都搞好了,我再把需要的工廠都補上去。

    對我來說,這個補充就是----仿佛是給”接口或抽象類“制造一個new方法。

    所以,題目中的ignore不是說這真的不管,而只是說我相信一定可以搞定的意思。而在設計階段不用把它擺在主要位置而已。

    不知我有沒有給哥們您講清楚,再探討,再探討。  回復  更多評論
      

    # re: Java Web Application開發日志之二--“Ignore how they were created”,工廠方法模式應用 2007-05-26 13:44 goodstuff
    你講的深入淺出,非常棒,要繼續努力哦
    爭取做大陸的java的侯俊杰.  回復  更多評論
      

    主站蜘蛛池模板: 国产亚洲A∨片在线观看| 亚洲成A人片在线观看中文| 久久久久久a亚洲欧洲aⅴ| 日韩精品免费一线在线观看| 四虎免费久久影院| 野花视频在线官网免费1| 国产精品免费_区二区三区观看| 亚洲欧洲无码AV不卡在线| 黄a大片av永久免费| 亚洲.国产.欧美一区二区三区| 日韩一品在线播放视频一品免费| 自拍偷区亚洲国内自拍| 在线免费一区二区| 日韩毛片一区视频免费| 久久亚洲av无码精品浪潮| 免费成人高清在线视频| 91嫩草私人成人亚洲影院| 91九色精品国产免费| 激情综合亚洲色婷婷五月| 天天摸夜夜摸成人免费视频| 18禁亚洲深夜福利人口| 亚洲日韩在线观看免费视频| 成人免费乱码大片A毛片| 亚洲成年轻人电影网站www| 永久免费视频网站在线观看| 亚洲综合色丁香婷婷六月图片| 国产免费人人看大香伊| 国产久爱免费精品视频| 亚洲色图国产精品| 成年性生交大片免费看| 一级毛片免费在线| 久久久久亚洲av无码专区导航| 99久久免费精品国产72精品九九| 亚洲国产成人综合精品| 亚洲精品亚洲人成在线观看| 114级毛片免费观看| 国产成人不卡亚洲精品91| 亚洲国产精品特色大片观看完整版| 2019中文字幕在线电影免费 | 免费看香港一级毛片| 人妻巨大乳hd免费看|