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

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

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

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

 

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

/// <summary>
    /// 所有鸟类的抽象基类
    /// </summary>
    public abstract class Bird
    {
        public virtual void Feather()
        {
            Console.Write("我有羽毛了\r\n");
        }

        public virtual void Wing()
        {
            Console.Write("我有翅膀了\r\n");
        }
    }


//老鹰类--也是鸟类
 class Eagle:Bird
    {
        public override void Feather()
        {
            base.Feather();
        }

        public override void Wing()
        {
            Console.Write("我是老鹰我的翅膀很宽阔!\r\n");
        }

    }


//鸵鸟类
public class Ostrich : Bird
    {
       public override void Feather()
       {
           base.Feather();
       }
       public override void Wing()
       {
           Console.Write("我是驼鸟有翅膀也不能飞!\r\n");
       }
    }


//麻雀类
class Sparrow:Bird
    {
        public override void Feather()
        {
            Console.Write("我是麻雀我的羽毛是麻色的!\r\n");
        }
        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。

  有没有更好的设计呢?

 

posted @ 2014-04-03 09:54  EchoLee  阅读(178)  评论(0编辑  收藏  举报