現在我們看到,在引進新產品(日志記錄方式)的情況下,我們并不需要去修改工廠類,而只是增加新的產品類和新的工廠類(注意:這是任何時候都不能避免的),這樣很好的符合了開放封閉原則。
ASP.NET HTTP通道中的應用
Factory Method模式在ASP.NET HTTP通道中我們可以找到很多的例子。ASP.NET HTTP通道是System.Web命名空間下的一個類,WEB Server使用該類處理接收到的HTTP請求,并給客戶端發送響應。HTTP通道主要的工作有Session管理,應用程序池管理,緩存管理,安全等。
System.Web.HttpApplicationFactory
HttpRuntime是HTTP通道的入口點,它根據每一個具體的請求創建一個HttpContext實例, HttpRuntime并沒有確定它將要處理請求的HttpApplication對象的類型,它調用了一個靜態的工廠方法HttpApplicationFactory.GetApplicationInstance,通過它來創建HttpContext實例。GetApplicationInstance使用HttpContext實例來確定針對這個請求該響應哪個虛擬路徑,如果這個虛擬路徑以前請求過,HttpApplication(或者一個繼承于ASP.Global_asax的類的實例)將直接從應用程序池中返回,否則針對該虛擬路徑將創建一個新的HttpApplication對象并返回。如下圖所示:
HttpApplicationFactory.GetApplicationInstance帶有一個類型為HttpContext的參數,創建的所有對象(產品)都是HttpApplication的類型,通過反編譯,來看一下GetApplicationInstance的實現:
1internal static IHttpHandler GetApplicationInstance(HttpContext context)
2{
3 if (HttpApplicationFactory._customApplication != null)
4 {
5 return HttpApplicationFactory._customApplication;
6 }
7 if (HttpDebugHandler.IsDebuggingRequest(context))
8 {
9 return new HttpDebugHandler();
10 }