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();
    }

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

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/yzenet/p/5110549.html
Copyright © 2011-2022 走看看