首页 > 代码库 > 设计模式-工厂方法模式

设计模式-工厂方法模式

前言

点击查看:设计模式系列 

如果你对工厂模式这个概念不是很理解,建议:设计模式-简单工厂模式 

如果你对.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.传递给工厂的参数告知其返回几种类型的类中的哪一个,在这种情况下,类可能会共用相同的方法名称,但要实现的事情可能是很不相同的。

设计模式,讨论,运用,欢迎加入博客园左上方群