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


    参照: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。

      有没有更好的设计呢?

  • 相关阅读:
    版本管理工具:linux下svn的基本使用
    驱动: 中断【3】为什么可能导致睡眠的函数都不能在中断上下文中使用呢?
    驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
    驱动: 中断【1】linux中断流程
    驱动: oops
    嵌入式:nfs挂载开发板的几个陷阱
    字符设备驱动: register_chrdev和register_chrdev_region
    likely() and unlikely()
    windows desktop.ini
    高通电源管理qpnp-vm-bms驱动
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3642262.html
Copyright © 2020-2023  润新知