1 #region 单例模式 2 #region 线程非安全单例模式 3 public class Singleton1 4 { 5 private Singleton1() { } 6 private static Singleton1 testdemo1 = null; 7 public static Singleton1 GetSingleton() 8 { 9 if (testdemo1 == null) 10 return new Singleton1(); 11 else 12 return testdemo1; 13 } 14 } 15 #endregion 16 #region 线程安全单例模式 17 public class Singleton 18 { 19 private Singleton() { } 20 private static Singleton singleton = new Singleton(); 21 public static Singleton GetSingleton() { return singleton; } 22 } 23 #endregion 24 #endregion 25 #region 工厂模式 26 public abstract class Food 27 { 28 public abstract void Print(); 29 } 30 #region 实现吃的方法 31 public class TomatoScrambledEggs : Food 32 { 33 public override void Print() 34 { 35 Console.WriteLine("西红柿炒鸡蛋好了"); 36 } 37 } 38 public class ShreaddedPorkWithPotatoes : Food 39 { 40 public override void Print() 41 { 42 Console.WriteLine("土豆丝炒鸡蛋好了"); 43 } 44 } 45 #endregion 46 public abstract class Creator 47 { 48 public abstract Food CreateFoddFactory(); 49 } 50 public class ShreaddedPorkWithPotatoesFactory : Creator 51 { 52 public override Food CreateFoddFactory() 53 { 54 return new ShreaddedPorkWithPotatoes(); 55 } 56 } 57 public class TomatoScrambledEggsFactory : Creator 58 { 59 public override Food CreateFoddFactory() 60 { 61 return new TomatoScrambledEggs(); 62 } 63 } 64 #endregion
工厂方法模式的UML图
讲解完工厂模式的具体实现之后,让我们看下工厂模式中各类之间的UML图:
从UML图可以看出,在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:
Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类
TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品
Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类
TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。
四、.NET中实现了工厂方法的类
.NET 类库中也有很多实现了工厂方法的类,例如Asp.net中,处理程序对象是具体用来处理请求,当我们请求一个*.aspx的文件时,此时会映射到System.Web.UI.PageHandlerFactory类上进行处理,而对*.ashx的请求将映射到System.Web.UI.SimpleHandlerFactory类中(这两个类都是继承于IHttpHandlerFactory接口的),关于这点说明我们可以在“C:WindowsMicrosoft.NETFrameworkv4.0.30319ConfigWeb.Config”文件中找到相关定义,具体定义如下:
<httpHandlers> <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" /> <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" /> <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /> </httpHandlers>
下面我们就具体看下工厂方法模式在Asp.net中是如何实现的,如果对一个Index.aspx页面发出请求时,将会调用PageHandlerFactory中GetHandler方法来创建一个Index.aspx对象,它们之间的类图关系如下:
五、总结
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。