设计模式-工厂方法模式

前言

点击查看:设计模式系列 

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

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

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

 

posted @ 2014-08-18 16:29  张龙豪  阅读(5915)  评论(0编辑  收藏  举报