zoukankan      html  css  js  c++  java
  • 設計模式应用之工厂方法模式

    對於http請求原理的朋友應該了解IIS上後綴映射

    /*当我们请求一个*.aspx的文件时,此时会映射到System.Web.UI.PageHandlerFactory类上进行处理,而对*.ashx的请求将映射到System.Web.UI.SimpleHandlerFactory类中
    (这两个类都是继承于IHttpHandlerFactory接口的)*/

    下面用一線圖來直觀的看一下

    圖引用:http://www.cnblogs.com/zhili/p/FactoryMethod.html

    為了更直觀的代碼DEOM我把.net部分源碼弄出來了

    /*当我们请求一个*.aspx的文件时,此时会映射到System.Web.UI.PageHandlerFactory类上进行处理,而对*.ashx的请求将映射到System.Web.UI.SimpleHandlerFactory类中
    (这两个类都是继承于IHttpHandlerFactory接口的)*/
    
    //抽象工廠
    public interface IHttpHandlerFactory
    {
        //返回接口---->抽象產品角色
        IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
        void ReleaseHandler(IHttpHandler handler);
    }
    
    //具體工廠
    internal class SimpleHandlerFactory : IHttpHandlerFactory2, IHttpHandlerFactory
    {
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
        {
            return ((IHttpHandlerFactory2)this).GetHandler(context, requestType, VirtualPath.CreateNonRelative(virtualPath), path);
        }
        //其他方法省略掉了.....
    }
    
    //具體工廠
    public class PageHandlerFactory : IHttpHandlerFactory2, IHttpHandlerFactory
    {
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
        {
            return this.GetHandlerHelper(context, requestType, VirtualPath.CreateNonRelative(virtualPath), path);
        }
        //其他方法省略掉了.....
    }
    
    //抽象產品角色
    public interface IHttpHandler
    {
        bool IsReusable{get;}
        void ProcessRequest(HttpContext context);
    }
    
    //頁面aspx(具體頁面產品)
    public partial class SystemManager_WebsitePublishing_publishServerFileManageList : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {  
            
        }
    }
    public class Page : IHttpHandler
    {
        
    }
    /*-------------------------------------------------------*/
    //一般處理程序ashx(具體一般處理程序產品)
    public class getPublishServerQueueInfo : IHttpHandler
    {
        public void ProcessRequest (HttpContext context) {
        
        }
        public bool IsReusable {
            get {
                return false;
            }
        }
    }

    //沒有在場景用的小例子:

    //抽象产品
    public interface ILight
    {
        void TurnOn();
        void TurnOff();
    }
    
    //具体的产品类:灯泡
    public class BulbLight:ILight
    {
        public void TurnOn()
        {
            Console.WriteLine("BulbLight turns on.");
        }
    
        public void TurnOff()
        {
            Console.WriteLine("BulbLight turns off.");
        }
    }
    
    // 具体的产品类:灯管
    public class TubeLight:ILight
    {
        public void TurnOn()
        {
            Console.WriteLine("TubeLight turns on.");
        }
    
        public void TurnOff()
        {
            Console.WriteLine("TubeLight turns off.");
        }    
    }
    
    //抽象的工厂类
    public interface ICreator
    {
        ILight CreateLight();
    }
    
    //具体灯泡工厂
    public class BulbCreator:ICreator
    {
        public ILight CreateLight()
        {
            return new BulbLight();
        }
    }
    
    //具体灯管工厂
    public class TubeCreator:ICreator
    {
        public ILight CreateLight()
        {
            return new TubeLight();
        }
    }
    
    static void Main(string[] args)
    {
        //先给我来个灯泡
        ICreator creator = new BulbCreator();
        ILight light = creator.CreateLight();
        light.TurnOn();
        light.TurnOff();
    
        //再来个灯管看看
        creator = new TubeCreator();
        light = creator.CreateLight();
        light.TurnOn();
        light.TurnOff();
    }

    把上面兩個看一看 比較一下 是不是這麼一回事啊!(注:下面这个例子引用博客园某位博友的代码)

  • 相关阅读:
    【转】HTTP 状态码详解
    程序员自我提升之粗粮与细粮
    配置Eclipse支持MacBook Pro Retina屏幕的办法(解决Retina屏幕下eclipse字体变虚的问题)
    IE6下lineheight失效:当文字与图片img在同一行中显示时lineheight失效的解决办法
    2013年第二周的总结
    为什么这么多的云存储产品却没有一个能够统一管理它们的应用出现
    微软的云笔记:OneNote+SkyDrive
    完美的外出上网解决方案随身随地享用你的专有WIFI网络(3G无线路由器+sim卡卡托+3G资费卡)
    [转]如何才能更加有效率
    Perl Note
  • 原文地址:https://www.cnblogs.com/yzenet/p/5110549.html
Copyright © 2011-2022 走看看