<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


    “共享”的思想

    共享的idea是生活中最基本的idea,不必有意的使用,到處已經存在了。在生活中,大部分事物都是被多人多次使用的,這都是共享的實際應用。

     

    之于OO的共享

     

    OO中的共享,無非就是說讓“對象”也能被“多人多次”(這里的“人”也無非就是進程、線程而已)使用,更詳細的說,就是要讓對象的生存空間更大一些,生存周期更長一些。

     

    自己悶個兒腦子,提煉出了幾個需要使用共享的環境(context),也可以說是原因吧:

    1.         為了保持“對象”的一致,我們需要共享。例如,“國家主席”就一個,不能多了,如果多了,難免決策混亂。

    2.         為了控制“對象”的存儲空間,我們需要共享。畢竟,目前來說,系統的memory還是編程時最珍貴的資源。

    3.         為了優化“對象”的創建消耗,我們需要共享。如果,一個對象的創建過程消耗太大,系統不能支持頻繁的創建,共享的使用它也是一個好主意。

    4.         等等。

     

    而在實際的應用中,往往我并沒有細想“我為什么使用共享?”,已經不自覺的就用了;如果真的認真分析起來,基于的環境也是多樣,并不會只是上面的其中一種。

     

    常用的“共享”方法或模式(我曾經用過的,知道的不多,望諒解):

    1.         Singleton模式”:一個class就一個對象實例,大家都用它,滿足context1

    2.         pool技術”:只提供一定數目的對象,大家都用他們,實現context2context3

    3.         flyweight模式”:一個class的一個狀態就一個對象實例,實現一個狀態對象的共享,實現context2context3

     

    使用時要注意的地方:

    1.         確定共享的scope。例如,在Java Web Application中就是選擇是pagesession還是application,當然也可以是jvm級別的static

    2.         確認thread safe。當共享的對象可能被多個線程共享時,這是不可以回避的問題。

    3.         應對對象狀態的變化。一旦共享的對象發生了變化,我們怎么處理?改變之,舍棄之?也是我們需要確定的。

     

    項目中的應用:

     

    項目需求:

    為學校的同學提供Web查詢,查詢的內容有很多。其中,“查課表”、“查考表”是最為關鍵的需求,以后可能還要提供“查詢空閑自習教室”的功能。

    在這些查詢中,有一個共同點,就是都涉及“教室”這一對象。“查課表”時要告訴同學在哪個教室上課,“查考表”時要告訴同學在哪個教室考試,等等。

     

    數據庫設計:

    對于“查課表”用例,有關的數據庫設計如下:
    o_5-1-1.jpg 


    對象層的設計:

    o_5-1.JPG
     

    學生每查詢一門課程的課表,系統就會sql查詢“視圖V_LESSONSCHEDULE”,進而生成一個LessonSchedule對象,然后返回給用戶顯示。當然,在生成這個LessonSchedule對象的過程中,屬于它的Classroom對象,以及更深一步的BuildingArea對象都會生成。下面就是這個過程的順序圖:

     

    o_5-2.JPG 


    因此,每生成一個“課表”對象(
    LessonSchedule)或“考表”對象(ExamSchedule)時,都要:

    1.         查數據庫中的教室、教學樓、校區的信息;

    2.         創建相應的“教室對象”(包括了屬于它的“教學樓”對象和“校區”對象)。

     

    考慮共享“教室”對象

    “教室”對象一旦可以生成以后,完全可以給后續共享使用,不必要每個查詢都要去生成。

     

    詳細說是基于下面的考慮:

    1.         這類查詢用例(查課表,查考表)發生的頻繁很高很高,也就是說,一旦讓用戶查起來,系統中會產生大量的“教室”對象這類對象,應該說會占很大的內存空間。

    2.         共享“教室”對象后,可以減少對數據庫的查詢次數,并降低了查詢粒度(以前是基于二級視圖查詢,現在可以基于基本表查詢),提高了一點數據庫查詢性能。

     

    當然,同時我腦袋中也有反對的聲音:

    1.         雖說,這類查詢會產生很多相同的“教室”對象,但是JVM本生提供的垃圾回收功能完全可以處理它。除非,“同時”有很多很多這類對象都在被使用,根本回收不了,才會造成內存短缺。

    2.         如果,我以某種共享機制讓這些“教室”對象,在系統中存在下來(延長了生命周期)了。而它們本身的數目就很多(如,我們學校就有××),可能還沒有等你用上,系統已經掛了。另外,如果不是同時有很多查詢需要,我留這么多“教室”對象在系統里,反而是占了內存,而不是優化了內存的使用。

    1.         所有模式的通病――“增加了復雜度”。

     

    結論:

    經過我們分析,系統對于“教室”對象的重復使用,頻繁程度非常高。一般,有10個人同時使用,就有5個人左右涉及的用例要使用“教室”對象。把它共享起來,還是有一定必要的。

     

    進一步考慮:

    而實際上,我們可以進一步共享下去:

    除了讓客戶端共享“教室對象(Classroom)”外,還可以讓“教室對象”共享“教學樓對象(Building)”,和讓“教學樓對象”共享“校區對象(Area)”。

    因此,最終的共享是在三級上都實現。

     

    Flyweight模式:

     

    特點:

    書上說:“享元模式可以使系統中的大量小粒度對象被共享使用”。第一,對象出現的量要大,想必這比較好理解,很少使用的也就沒有必要共享了;第二,要小粒度,我比較納悶?難道對于大粒度對象就不行嗎?可能書上認為,大粒度對象的共享已經占了比較大的空間,沒有小對象那么有效吧。

     

    另外,書上還說,要使用“享元模式”,被共享的對象的狀態(類別)要比較固定,這樣就可以為每一個狀態僅僅創建一個對象。當然,如果每次使用對象時,對象的狀態都是不一樣的,那就根本不存在共享這些對象的必要了。

     

    聯系項目思考:

    基于上面對項目的分析,“教室”、“教學樓”、“校區”對象都是在系統中會被大量使用的對象,而且粒度的確比較小;并且它們有固定的類別,而且不易改變。如校區對象,暫時就有4個。教學樓可能4050個左右。很適合“享元模式”的使用環境。

     

    確定共享方式:

    1.         確定共享對象的scope。在本web程序中,這些共享對象的scope理應是application,而更簡單的一個作法就是把這些對象設為static,我選擇后者。

    2.         確認thread safe。這些對象是可能被多個servlet訪問的,也就是有可能存在多線程訪問。但是,由于這些對象的可變性很差,一旦創建就不大可能變化。因此,我決定把這寫共享對象設計成不變模式的,一旦創建就只會被讀取,而不會改寫,這樣就不存在多線程控制的問題了。

    3.         應對對象狀態的變化,如某個教室的類型變了。這里采取的是舍棄的方法,為每個工廠添加了一個清空方法――clear(),用于清空已經生成的共享對象。

     

    設計類圖:

    o_5-3.JPG 

    當然,也可以把這些工廠都設計成“Singleton模式”的,使它們只會有一個實例。

     

    客戶端使用:

    由于共享的對象都被包含在了“課表”和“考表”對象里,不會被客戶端直接訪問,因而不會對客戶端的使用有任何影響:

     

    實例代碼

     
     1//取得編號為32號課程的“課表對象”
     2
     3LessonSchedule oneLesson = LessonSchedule.findByLessonNum(32);
     4
     5 
     6
     7//獲得教室對象
     8
     9Classroom oneClassroom = oneLesson.getLnkClassroom();
    10
    11 
    12
    13//獲得教學樓對象
    14
    15Building oneBuilding = oneClassroom.getLnkBuilding();
    16
    17 
    18
    19//獲得校區對象
    20
    21Area oneArea = oneBuilding. getLnkArea();
    22
    23 
    24
    25//再次重新生成一個編號為32號的“課表對象”
    26
    27LessonSchedule twoLesson = LessonSchedule.findByLessonNum(32);
    28
    29 
    30
    31//獲得教室對象
    32
    33Classroom twoClassroom = twoLesson.getLnkClassroom();
    34
    35 
    36
    37//獲得教學樓對象
    38
    39Building twoBuilding = twoClassroom.getLnkBuilding();
    40
    41 
    42
    43//獲得校區對象
    44
    45Area twoArea = twoBuilding. getLnkArea();
    46

    oneClassroomtwoClassroomoneBuildingtwoBuildingoneAreatwoArea由于都是32號課程的東西,根據我們的設計意圖,應該實現共享。

    而實際上,它們每對的確是同一個對象的引用。因此,實現了預期的設想。

     

    Review

    在本項目中,當第一次設計出來的時候,我們發現了某些對象恰好有共享的需要。

     

    而更多的實際情況是,這些需要共享的“信息或狀態”在設計中并不是那么恰好的表現為“一個對象”的粒度,而是要不就包含在一個對象內部,要不就跨幾個對象。在這樣的情況下,共享的設計更多是發生在代碼重構階段而不是第一的設計階段。當然,為了共享對象而做出的代碼重構,最重要的一步就是把需要共享的“信息或狀態”設計成為新的對象。

     

    對于,“享元模式”來說,就是要把需要共享的“信息或狀態”設計成“享元對象”。別的在此就不說了,因為我也不懂了,呵呵。


                                              MARCO ZHANG 2006年2月23日13:48:49

    posted on 2006-02-23 14:14 marco 閱讀(1284) 評論(4)  編輯  收藏 所屬分類: -=Design Pattern=--=Java Techs=--=Project Experience=-

    Feedback

    # re: Java Web Application開發日志之五--“design with the think of sharing objects”,Flyweight模式應用 2006-02-23 19:17 小萍
    怎么沒有之三?  回復  更多評論
      

    # re: Java Web Application開發日志之五--“design with the think of sharing objects”,Flyweight模式應用 2006-02-23 20:25 marco
    對不起,之三中有些東西自己還沒有想清楚,不能亂post啊,起碼要說服自己撒,呵呵。  回復  更多評論
      

    # re: Java Web Application開發日志之五--“design with the think of sharing objects”,Flyweight模式應用 2006-02-24 09:17 王知真
    才兩三天沒有看,就寫了這么多了啊,牛X,繼續關注ing  回復  更多評論
      

    # re: Java Web Application開發日志之五--“design with the think of sharing objects”,Flyweight模式應用 2006-03-04 17:09 tianfei
    寫了好多啊,快成模式專家了,有時間我也要再研究一下模式  回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV成人无码久久精品老人| 亚洲日本一区二区三区在线| 国产精品免费久久久久久久久 | 亚洲理论在线观看| 亚洲精品网站在线观看不卡无广告| 国产精品区免费视频| 久久嫩草影院免费看夜色| 亚洲精品中文字幕| 亚洲精品不卡视频| 国产亚洲3p无码一区二区| 亚洲中文字幕无码爆乳av中文| 免费无码黄动漫在线观看| 免费无码又黄又爽又刺激| 久久www免费人成看片| 久久久免费精品re6| 久久aa毛片免费播放嗯啊| 丁香花在线视频观看免费| 成人免费无码H在线观看不卡| 一区二区三区免费高清视频| 国产精品亚洲一区二区三区| 久久久亚洲精华液精华液精华液| 亚洲AV日韩综合一区尤物| 18禁亚洲深夜福利人口| 无套内谢孕妇毛片免费看看| eeuss影院www天堂免费| a级毛片视频免费观看| 久久这里只精品99re免费| 中文字幕免费观看| 国产免费av片在线无码免费看 | 日韩色视频一区二区三区亚洲| 男人j进女人p免费视频| 中文字幕无码免费久久| 在线看片v免费观看视频777| 毛片a级毛片免费观看免下载| 国产免费131美女视频| 亚洲精品福利视频| 免费一级全黄少妇性色生活片 | 亚洲另类图片另类电影| 美女视频黄a视频全免费网站色| 日本视频免费高清一本18| 国产极品粉嫩泬免费观看|