using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuLazyLoad.DuVirtualProxy { /// <summary> /// Lazy Load Pattern /// </summary> public class College { /// <summary> /// 序號 /// </summary> public int Id { get; init; } /// <summary> /// 圖書館信息 /// </summary> public virtual Library? Library { get; set; } /// <summary> /// /// </summary> public void ShowDetails() => Console.WriteLine( $"大學圖書館有 {Library!.NumberOfBooks} 本書 " + $"創建時間爲:{Library.EstablishmentDate.ToShortDateString()}."); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuLazyLoad.DuVirtualProxy { /// <summary> /// Lazy Load Pattern /// </summary> public class CollegeFactory { /// <summary> /// /// </summary> /// <param name="id"></param> /// <returns></returns> public College CreateFromId(int id) => new ProxyCollege(id); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuLazyLoad.DuVirtualProxy { /// <summary> /// /// </summary> public class ProxyCollege : College { /// <summary> /// Lazy Load Pattern /// </summary> /// <param name="id"></param> public ProxyCollege(int id) { Id = id; Console.WriteLine("學院信息初始化完成."); } /// <summary> /// /// </summary> public override Library? Library { get { if (base.Library == null) { base.Library = new Library(); } return base.Library; } set => base.Library = value; } /// <summary> /// /// </summary> /// <param name="obj"></param> /// <returns></returns> public override bool Equals(object? obj) { if (obj is not College college) { return false; } return college.Id == Id; } /// <summary> /// /// </summary> /// <returns></returns> public override int GetHashCode() => Id.GetHashCode(); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Geovin.Du.BuildingBlocks; namespace Geovin.Du.DuLazyLoad.DuVirtualProxy { /// <summary> /// Lazy Load Pattern /// </summary> public static class VirtualProxyExecutor { public static void Execute() { ConsoleExtension.WriteSeparator("延遲加載模式 Lazy Load Pattern--Virtual proxy demo"); var collegeFactory = new CollegeFactory(); var college = collegeFactory.CreateFromId(1); // College library shouldn't have been constructed before calling ShowDetails method. Console.WriteLine("給我更多關於這所大學的細節!"); college.ShowDetails(); } } }
調用:
Geovin.Du.DuLazyLoad.DuVirtualProxy.VirtualProxyExecutor.Execute();
輸出:
延遲加載模式 Lazy Load Pattern--Virtual proxy demo -------------------------------------------------- 學院信息初始化完成. 給我更多關於這所大學的細節! 加載庫... 大學圖書館有 210000 本書 創建時間爲:2008/5/28.