zoukankan      html  css  js  c++  java
  • 设计模式-工厂方法模式

    前言

    点击查看:设计模式系列 

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

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

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

  • 相关阅读:
    多重背包POJ1276不要求恰好装满 poj1014多重背包恰好装满
    哈理工1053完全背包
    求最小公倍数与最大公约数的函数
    Bus Pass ZOJ 2913 BFS 最大中取最小的
    POJ 3624 charm bracelet 01背包 不要求装满
    HavelHakimi定理(判断一个序列是否可图)
    z0j1008Gnome Tetravex
    ZOJ 1136 Multiple BFS 取模 POJ 1465
    01背包 擎天柱 恰好装满 zjut(浙江工业大学OJ) 1355
    zoj 2412 水田灌溉,求连通分支个数
  • 原文地址:https://www.cnblogs.com/knowledgesea/p/3919824.html
Copyright © 2011-2022 走看看