首页 > 学院 > 开发设计 > 正文

設計模式应用之工厂方法模式

2019-11-14 14:30:51
字体:
来源:转载
供稿:网友

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

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

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

圖引用:http://www.VEVb.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();}

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表