• 设计模式-工厂模式(二)


    参照:http://www.cnblogs.com/zery/p/3599491.html

    《----------工厂模式----------》

    用户使用某一个类去新建一个实例的时候,并不用关心具体的实现过程,只调用实例的方法就好。

    如上图所示,1. 有一个鸟类,定义了两个方法:羽毛和翅膀;2. 继承该鸟类实现了三个新的具体鸟类,分别有自己的特点;3. 设计一个工厂类,可以根据传入的名字参数,具体实例化不同的鸟类; 4. 客户端在调用鸟类的时候,只需要使用名字调用工厂类方法就可以实现,不管具体鸟类的实现过程;

    /// <summary>
        /// 所有鸟类的抽象基类
        /// </summary>
        public abstract class Bird
        {
            public virtual void Feather()
            {
                Console.Write("我有羽毛了
    ");
            }
    
            public virtual void Wing()
            {
                Console.Write("我有翅膀了
    ");
            }
        }
    
    
    //老鹰类--也是鸟类
     class Eagle:Bird
        {
            public override void Feather()
            {
                base.Feather();
            }
    
            public override void Wing()
            {
                Console.Write("我是老鹰我的翅膀很宽阔!
    ");
            }
    
        }
    
    
    //鸵鸟类
    public class Ostrich : Bird
        {
           public override void Feather()
           {
               base.Feather();
           }
           public override void Wing()
           {
               Console.Write("我是驼鸟有翅膀也不能飞!
    ");
           }
        }
    
    
    //麻雀类
    class Sparrow:Bird
        {
            public override void Feather()
            {
                Console.Write("我是麻雀我的羽毛是麻色的!
    ");
            }
            public override void Wing()
            {
                base.Wing();
            }
    
        }
    
    
    //工厂类,用于生成鸟
    public  class Factory
        {
           public static Bird CreateInstance(string birdType)
            {
                Bird instance = null;
                switch (birdType)
                {
                    case "Ostrich":
                        instance  =new Ostrich();
                        break;
                    case "Eagle":
                        instance = new Eagle();
                        break;
                    case "Sparrow":
                        instance = new Sparrow();
                        break;
                    
                }
                return instance;
            }
        }
    
    
    //客户端调用
    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("输入要生成鸟~~ Eagle Ostrich  Sparrow");
                string item = Console.ReadLine().Trim();
                Bird instance =  Factory.CreateInstance(item);
                instance.Feather();
                instance.Wing();
                Console.ReadLine();
            }
        }
    

      这样的设计过程非常的好,但是也不满足开闭原则,即在新增一个具体鸟类的时候,需要在工厂类中新增一个case。

      有没有更好的设计呢?

  • 相关阅读:
    54:代码审计-TP5框架审计写法分析及代码追踪
    53:代码审计-TP5框架及无框架变量覆盖反序列化
    52:代码审计-PHP项目类RCE及文件包含下载删除
    51:代码审计-PHP框架MVC类上传断点调试挖掘
    支配树学习笔记
    模拟费用流学习笔记
    python之元类、双下方法( 双下方法也叫魔术方法、 内置方法)
    java 注解
    java 反射
    java synchronized
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3642262.html
Copyright © 2020-2023  润新知