西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識 → 使用代理模式模擬ORM實體的延時加載

使用代理模式模擬ORM實體的延時加載

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:海島孤雁時間:2011/7/31 23:41:20字體大。A-A+

作者:海島孤雁點擊:26次評論:0次標(biāo)簽: ORM

ORM一鍵還原系統(tǒng)V4.1.29.1 官方最新版
  • 類型:備份還原大小:8.8M語言:中文 評分:10.0
  • 標(biāo)簽:
立即下載

.NET中的Entity Framework 和 java里面的 Hibernate都是ORM框架,它們中間都用到延時加載,延時加載對于提高性能,減小服務(wù)器內(nèi)存壓力有很大的作用。所謂延時加載,就是只有在第一次調(diào)用某個實體的方法或?qū)傩詴r才初始化該實體。延時加載適用于創(chuàng)建開銷大的對象。如下,我采用代理模式模擬了一個簡單的延時加載的例子。

首先,我定義了一個接口,名為IOperation,定義如下:


 1 public interface IOperation
 2 {
 3     /// <summary>
 4     /// 聲明一個描述類信息的方法,由子類實現(xiàn)。
 5     /// </summary>
 6     void Describe();
 7     /// <summary>
 8     /// 聲明一個銷毀訂單的操作,由子類操作
 9     /// </summary>
10     void DestoryOrder();
11 }



     然后定義兩個實體類,Product類和Order類,分別表示兩個相互關(guān)聯(lián)的實體,在Product類中注入Order類的變量用以在Product類中調(diào)用Order類的實例方法。并且讓Product類實現(xiàn)IOperate接口。

Product類定義如下:


 1 public class Product : IOperation
 2 {
 3     private Order _order;
 4     public Product()
 5     {
 6         Console.WriteLine(">>開始初始化Product類...");
 7         Stopwatch sw = new Stopwatch();
 8         sw.Start();
 9         this._order = new Order();
10         sw.Stop();
11         Console.WriteLine(">>初始化Product類完成。耗時:{0}秒", sw.ElapsedMilliseconds / 1000);
12     }
13     public void Describe()
14     {
15         Console.WriteLine(">>Product描述:我的是Product類的實例,Describe方法執(zhí)行完成。");
16     }
17     public void DestoryOrder()
18     {
19         Console.WriteLine(">>Product.DestoryOrder()方法開始執(zhí)行...");
20         if (_order != null)
21         {
22             //調(diào)用Order類的Destroy實例方法,銷毀自己。
23             _order.Destroy();
24             Console.WriteLine(">>Product.DestoryOrder()方法執(zhí)行完成。");
25         }
26     }
27 }



Order類定義如下: 


 1 public class Order
 2 {
 3     public Order()
 4     {
 5         Console.WriteLine(">>開始初始化Order類...");
 6         System.Threading.Thread.Sleep(5000);
 7         Console.WriteLine(">>初始化Order類完成。");
 8     }
 9 
10     public void Destroy()
11     {
12         Console.WriteLine(">> Order 已銷毀。");
13     }
14 }

然后在主程序里面調(diào)用一下:


 1 static void Main(string[] args)
 2 {
 3     Console.WriteLine("==========不使用代理類調(diào)用Describe()方法===============");
 4     Product p = new Product();
 5     p.Describe();
 6     Console.WriteLine("==========不使用代理類調(diào)用DestoryOrder()方法===============");
 7     Product p2 = new Product();
 8     p2.DestoryOrder();
 9     Console.ReadKey();
10 }

>

測試結(jié)果如下:

從上圖中,我們可以看出,調(diào)用Describe()方法初始化Product類用了5秒,這是不是有問題?再看看上面的Describe()方法的實現(xiàn),只簡單的輸出了一句話,怎么會用5秒?再看Product的構(gòu)造函數(shù)里面,在初始化Product類的實例的時候,把Order類也初始化了,但是我這個Describe()方法并沒有調(diào)用Order類的任何方法和屬性,所以這就造成了不必要的內(nèi)存開銷,而且初始化了的Order類的實例也沒有使用,產(chǎn)生了垃圾對象。

      怎么解決這個問題呢?所以這個地方就得用代理了,代理是個什么東西呢?代理簡單來說,就是制造一個與被調(diào)對象具有相同功能(這個相同功能通常由接口去規(guī)范)的類,在這個類中可以調(diào)用被調(diào)對象的方法,也可以自定義新的方法供調(diào)用方使用。下面就是代理類的創(chuàng)建。

首先,我創(chuàng)建一個代理類,名為ProxyProduct,讓它也實現(xiàn)IOperate接口,定義如下:


 1public class ProxyProduct : IOperation
 2{
 3    private IOperation entity;
 4
 5    public ProxyProduct(IOperation entity)
 6    {
 7        Console.WriteLine(">>開始初始化ProxyProduct...");
 8        Stopwatch sw = new Stopwatch();
 9        sw.Start();
10        this.entity = entity;
11        sw.Stop();
12        Console.WriteLine(">>初始化ProxyProduct完成。耗時:{0}秒", sw.ElapsedMilliseconds / 1000);
13    }
14    /// <summary>
15    /// 實現(xiàn)IOperation的方法
16    /// </summary>
17    public void Describe()
18    {
19        Console.WriteLine(">>ProxyProduct描述:我的是ProxyProduct類的實例,Describe()方法執(zhí)行完成。");
20    }
21    /// <summary>
22    /// 實現(xiàn)IOperation的方法
23    /// </summary>
24    public void DestoryOrder()
25    {
26        Console.WriteLine(">>ProxyProduct.DestoryOrder()方法開始執(zhí)行...");
27        if (entity == null)
28        {
29            entity = new Product();
30        }
31        entity.DestoryOrder();
32        Console.WriteLine(">>ProxyProduct.DestoryOrder()方法執(zhí)行完成。");
33    }
34}



在主程序里面測試一下:


 1 static void Main(string[] args)
 2 {
 3     Console.WriteLine("==========使用代理類調(diào)用Describe()方法===============");
 4     IOperation desc = new ProxyProduct(null) as IOperation;
 5     if (desc != null)
 6     {
 7         desc.Describe();
 8     }
 9     Console.WriteLine("==========使用代理類調(diào)用DestoryOrder()方法===============");
10     IOperation desc2 = new ProxyProduct(null) as IOperation;
11     if (desc2 != null)
12     {
13         desc2.DestoryOrder();
14     }
15     Console.ReadKey();
16 }

測試結(jié)果如下:

      從上圖看出,調(diào)用Describe()方法時耗時0秒,調(diào)用DestoryOrder()方法時,初始化代理類用了0秒,初始化Product類用了5秒,所以執(zhí)行DestroyOrder()方法一共花費了5秒。這樣的結(jié)果是令人滿意的,使用代理類就實現(xiàn)了“調(diào)用誰的方法,就初始化誰;不調(diào)用不初始化”的想法。這樣的話,如果我永遠(yuǎn)只調(diào)Describe()方法,那么我花費的時間永遠(yuǎn)是0秒,而不會產(chǎn)生額外的開銷,這對性能優(yōu)化有很大的幫助。

      總結(jié):代理模式應(yīng)用之一:對于某些創(chuàng)建時需要很大開銷的對象,我們可以使用代理讓這個對象在第一次調(diào)用它的方法或?qū)傩詴r才創(chuàng)建它的實例,不調(diào)用它的方法或?qū)傩詣t永遠(yuǎn)不創(chuàng)建它的實例。好處:性能優(yōu)化,減小內(nèi)存開銷。

 ==================================================================================================================
如下是java代碼實現(xiàn):
接口:IOperate


 1 public interface IOperate {
 2     /**
 3      * 聲明一個描述類信息的方法,由子類實現(xiàn)。
 4      */
 5     void describe();
 6     /**
 7      * 聲明一個銷毀訂單的方法,由子類實現(xiàn)。
 8      */
 9     void destroyOrder();
10 }




實現(xiàn)類:ProductBean


 1 public class ProductBean implements IOperate {
 2     private OrdersBean ordersBean;
 3 
 4     /**
 5      * 初始化ProductBean類的實例
 6      */
 7     public ProductBean() {
 8         System.out.println(">>開始初始化ProductBean....");
 9         long startTime = System.currentTimeMillis();
10         this.ordersBean = new OrdersBean();
11         long endTime = System.currentTimeMillis();
12         System.out.println(">>初始化ProductBean完成。耗時:" + (endTime - startTime) / 1000 + "秒");
13     }
14 
15     public void describe() {
16         System.out.println(">>describe描述:我是ProductBean類,執(zhí)行了describe()方法。");
17     }
18 
19     public void destroyOrder() {
20         System.out.println(">>開始執(zhí)行ProductBean.destroyOrder()方法...");
21         if (this.ordersBean != null) {
22             this.ordersBean.destroy();
23             System.out.println(">>ProductBean.destroyOrder()方法執(zhí)行完成。");
24         }
25     }
26 }



實體類:OrderBean


 1 public class OrdersBean {
 2     public OrdersBean() {
 3         System.out.println(">>開始初始化OrderBean.....");
 4         InitOrder();
 5         System.out.println(">>初始化OrderBean完成。");
 6     }
 7 
 8     /**
 9      * 初始化訂單
10      */
11     private void InitOrder() {
12         try {
13             // 加載訂單數(shù)據(jù),這里模擬耗時3秒。
14             Thread.sleep(5000);
15         } catch (Exception e) {
16             e.printStackTrace();
17         }
18     }
19     
20     public void destroy() {
21         System.out.println(">> Order 已銷毀。");
22     }
23 }

代理類:ProxyProductBean


 1 public class ProxyProductBean implements IOperate {
 2     private IOperate bean;
 3 
 4     public ProxyProductBean(IOperate bean) {
 5         System.out.println(">>開始初始化ProxyProductBean.....");
 6         long startTime = System.currentTimeMillis();
 7         this.bean = bean;
 8         long endTime = System.currentTimeMillis();
 9         System.out.println(">>初始化ProxyProductBean完成。耗時:" + (endTime - startTime) / 1000 + "秒");
10     }
11 
12     public void describe() {
13         System.out.println(">>describe描述:我是ProxyProductBean類,執(zhí)行了describe()方法。");
14     }
15 
16     public void destroyOrder() {
17         System.out.println(">>開始執(zhí)行ProxyProductBean.destroyOrder()方法...");
18         if (bean == null) {
19             bean = new ProductBean();
20             bean.destroyOrder();
21             System.out.println(">>執(zhí)行ProxyProductBean.destroyOrder()方法完成。");
22         }
23     }
24 }

測試類:


 1 public class Test {
 2     public static void main(String[] args) {
 3         System.out.println("==========不使用代理類調(diào)用describe()方法===============");
 4         ProductBean productBean = new ProductBean();
 5         productBean.describe();
 6         System.out.println("==========使用代理類調(diào)用describe()方法===============");
 7         IOperate description = (IOperate) (new ProxyProductBean(null));
 8         description.describe();
 9         System.out.println("==========不使用代理類調(diào)用cascadeOperate()方法===============");
10         ProductBean productBean2 = new ProductBean();
11         productBean2.destroyOrder();
12         System.out.println("==========使用代理類調(diào)用cascadeOperate()方法===============");
13         IOperate description2 = (IOperate) (new ProxyProductBean(null));
14         description2.destroyOrder();
15     }
16 }

測試結(jié)果輸出如下:
==========不使用代理類調(diào)用describe()方法===============
>>開始初始化ProductBean....
>>開始初始化OrderBean.....
>>初始化OrderBean完成。
>>初始化ProductBean完成。耗時:5秒
>>describe描述:我是ProductBean類,執(zhí)行了describe()方法。
==========使用代理類調(diào)用describe()方法===============
>>開始初始化ProxyProductBean.....
>>初始化ProxyProductBean完成。耗時:0秒
>>describe描述:我是ProxyProductBean類,執(zhí)行了describe()方法。
==========不使用代理類調(diào)用cascadeOperate()方法===============
>>開始初始化ProductBean....
>>開始初始化OrderBean.....
>>初始化OrderBean完成。
>>初始化ProductBean完成。耗時:5秒
>>開始執(zhí)行ProductBean.destroyOrder()方法...
>> Order 已銷毀。
>>ProductBean.destroyOrder()方法執(zhí)行完成。
==========使用代理類調(diào)用cascadeOperate()方法===============
>>開始初始化ProxyProductBean.....
>>初始化ProxyProductBean完成。耗時:0秒
>>開始執(zhí)行ProxyProductBean.destroyOrder()方法...
>>開始初始化ProductBean....
>>開始初始化OrderBean.....

    還原精靈
    (19)還原精靈
    還原精靈類的軟件一般常見于網(wǎng)吧,我們在網(wǎng)吧上網(wǎng)的時候不管使用一臺電腦下過什么或者刪除過什么,只要重啟之后機器都會恢復(fù)成原來的樣子,這種情況一般都是還原精靈的作用。相信有很多初學(xué)電腦的朋友都遇到過諸如系統(tǒng)崩潰、無法引導(dǎo)、病毒入侵和數(shù)據(jù)丟失等另他們頭痛不已的難題,而在解決這些問題后,我們往往會發(fā)現(xiàn)我們硬盤上的數(shù)據(jù)已經(jīng)被破壞或丟失了。正是因為這樣,學(xué)習(xí)如何保護好電腦中的數(shù)據(jù)的正確性與完整性就成了我們的首...更多>>
    一鍵還原
    (30)一鍵還原
    西西軟件園提供好用的一鍵還原工具合集下載,西西小編的電腦經(jīng)常1、2個星期就需要一鍵還原一次,所以一款好用的一鍵還原工具對西西小編來說很重要,西西小編使用的一鍵還原精靈,非常不錯哦,傻瓜式的系統(tǒng)備份還原免費工具,它具有安全、快速、保密性強、壓縮率高、兼容性好等特點,特別適合電腦新手和擔(dān)心操作麻煩的人使用。不修改硬盤分區(qū)表,安裝卸載倍加放心,自動選擇備份分區(qū),無需擔(dān)心空間是否夠用。完美支持多個分區(qū)備份還...更多>>
    備份還原
    (47)備份還原
    西西軟件園提供最好用的系統(tǒng)備份還原軟件,系統(tǒng)備份還原軟件功能強大,效率高:快速還原,昨日重現(xiàn),若感染病毒木馬或系統(tǒng)崩潰,快速恢復(fù)到健康狀態(tài);在Win32(64)、WinPE、DOS下對任意分區(qū)進(jìn)行一鍵備份、恢復(fù)的綠色無污程序,支持ISO文件、光盤、U盤里的GHO文件硬盤安裝。...更多>>
    • ghost3212.0.0.7031 綠色版

      11-15 / 1.5M

      推薦理由:不錯的工具,讓你感覺回到了DOS時代,大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個
    • 影子系統(tǒng)2011最新版

      02-14 / 2.1M

      推薦理由:影子系統(tǒng)Returnil System Safe Pro 2011Returnil System Safe Pro 2011是瑞泰尼爾公司采用最新虛擬技術(shù)實現(xiàn)
    • Gho文件瀏覽工具(Symantec Ghost E

      10-17 / 10.1M

      推薦理由:SymantecGhost是大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個磁盤上,也可以把磁盤
    • 大地一鍵還原備份工具V2版

      04-14 / 3.4M

      推薦理由:提供多種環(huán)境下的操作:win32、DOS,支持WINxp-Win7操作系統(tǒng)備份還原等功能,完美支持WIN7(隱藏分區(qū)等環(huán)境下
    • Ghost 8.3 和 Ghost11.5 合集綠色漢

      05-15 / 15.4M

      推薦理由:一、分區(qū)備份  使用Ghost進(jìn)行系統(tǒng)備份,有整個硬盤(Disk)和分區(qū)硬盤(Partition)兩種方式。在菜單中點
    • 雨林木風(fēng) OneKey GhostV13.5.23.20

      05-27 / 6.0M

      推薦理由:一、詳細(xì)說明: 1、默認(rèn)核心是 Ghost 11.5,可自定義 Ghost 版本 2、程序默認(rèn)對當(dāng)前系統(tǒng)所在分區(qū)進(jìn)行備份、
    聯(lián)想一鍵恢復(fù)
    (15)聯(lián)想一鍵恢復(fù)
    聯(lián)想一鍵恢復(fù)是專用于聯(lián)想電腦的一鍵恢復(fù)軟件,可以恢復(fù)為出廠系統(tǒng),可以做系統(tǒng)備份,有的版本可以進(jìn)行殺毒和隨機軟件安裝。聯(lián)想一鍵恢復(fù)詳細(xì)介紹:聯(lián)想一鍵恢復(fù)系統(tǒng)可用來備份系統(tǒng)分區(qū)(C分區(qū))的數(shù)據(jù)并在需要的時候使用此備份進(jìn)行系統(tǒng)恢復(fù)。在Windows操作系統(tǒng)下,可以創(chuàng)建整個系統(tǒng)分區(qū)的備份并將備份文件存儲在本地硬盤或者外部存儲設(shè)備上。除此之外,還可以創(chuàng)建恢復(fù)光盤,用于從光盤啟動和恢復(fù)系統(tǒng)。如果操作系統(tǒng)無法正常加載,...更多>>
    ghost
    (29)ghost
    西西軟件園提供最好用的一鍵GHOST工具,GHOST一鍵GHOS適應(yīng)各種用戶需要,既可獨立使用,又能相互配合.主要功能包括:一鍵備份C盤;一鍵恢復(fù)C盤;中文向?qū)?GHOST一鍵GHOST可輕易進(jìn)行系統(tǒng)還原,只需按一下"K"鍵,就能實現(xiàn)全自動無人值守操作,系統(tǒng)還原就這么簡單!...更多>>
    • ghost3212.0.0.7031 綠色版

      11-15 / 1.5M

      推薦理由:不錯的工具,讓你感覺回到了DOS時代,大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個
    • Gho文件瀏覽工具(Symantec Ghost E

      10-17 / 10.1M

      推薦理由:SymantecGhost是大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個磁盤上,也可以把磁盤
    • Ghost 8.3 和 Ghost11.5 合集綠色漢

      05-15 / 15.4M

      推薦理由:一、分區(qū)備份  使用Ghost進(jìn)行系統(tǒng)備份,有整個硬盤(Disk)和分區(qū)硬盤(Partition)兩種方式。在菜單中點
    • Ghost安裝工具v12.0.0.805 簡體中

      09-08 / 14.8M

      推薦理由:適合電腦初學(xué)者的ghost安裝工具~本程序基于Ghost11內(nèi)核,可以直接用光碟上的系統(tǒng)還原;蛘邚木W(wǎng)上下載的gho
    • 雨林木風(fēng) OneKey GhostV13.5.23.20

      05-27 / 6.0M

      推薦理由:一、詳細(xì)說明: 1、默認(rèn)核心是 Ghost 11.5,可自定義 Ghost 版本 2、程序默認(rèn)對當(dāng)前系統(tǒng)所在分區(qū)進(jìn)行備份、
    • 一鍵ghost 硬盤版v2016.02.16 中文

      02-16 / 17.6M

      推薦理由:一鍵GHOST是"DOS之家"首創(chuàng)的4種版本(硬盤版/光盤版/優(yōu)盤版/軟盤版)同步發(fā)布的啟動盤,適應(yīng)各種用戶需要,既可

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)