前言
点击查看:设计模式系列
如果你对工厂模式这个概念不是很理解,建议:设计模式-简单工厂模式
如果你对.net反射机制不了解,建议:.net反射详解
工厂方法模式
描述一下工厂方法的概要:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用到的类,做运算。而工厂方法模式则是他的一个聪明的扩展,不在工厂类中做决策,而是把这个决策推迟到每个用到他的地方。
等待使用的类库代码:
/// <summary> /// Live类 /// </summary> public abstract class Live { public abstract void Action(); } /// <summary> /// Music类 /// </summary> public class Music : Live { public override void Action() { Console.WriteLine("哼哼哈嘿,快使用刷结棍!"); } } /// <summary> /// Bread类 /// </summary> public class Bread : Live { public override void Action() { Console.WriteLine("努力,面包会有的,鸡蛋也会有的。"); } }
工厂方法实例化类:
/// <summary> /// LiveFactory类 /// </summary> public abstract class LiveFactory { public abstract Live Create(); } /// <summary> /// MusicFactory类 /// </summary> public class MusicFactory : LiveFactory { public override Live Create() { return new Music(); } } /// <summary> /// BreadFactory类 /// </summary> public class BreadFactory : LiveFactory { public override Live Create() { return new Bread(); } }
如何使用工厂类选择创建实例(反射优化):
public static void Main(string[] args) { LiveFactory liveFactory = new MusicFactory(); Live musicLive = liveFactory.Create(); musicLive.Action(); Console.ReadLine(); //使用反射优化,修改变量就可得到想要的结果,而不必修改代码 string strfactoryName = "BreadFactory"; LiveFactory factory; factory = (LiveFactory)Assembly.Load("设计模式").CreateInstance("设计模式.工厂方法模式." + strfactoryName); Live live = factory.Create(); live.Action(); Console.ReadLine(); }
使用此模式:降低调用端的耦合度,并且对于工厂来说,是可以扩展的,以后如果想过另外的一种生活方式,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。
什么时候使用工厂方法(此段摘自:《c#设计模式》,理解下)
下列情况考虑使用工厂方法
1.类不能预测它必须创建哪一种类型的对象。
2.类使用它的子类指定他要创建的对象。
3.希望只有局部知晓那个类被创建。
关于工厂模式会有几种变化,需要了解一下。
1.基类是抽象的,但模式必须返回一个可用的对象。
2.基类包含默认的方法,只有在默认方法不能胜任的情况下才调用这些方法。
3.传递给工厂的参数告知其返回几种类型的类中的哪一个,在这种情况下,类可能会共用相同的方法名称,但要实现的事情可能是很不相同的。
设计模式,讨论,运用,欢迎加入博客园左上方群