C# 工厂模式+虚方法(接口、抽象方法)实现多态

  面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态。

  实例说明:

  业务需求:实现一个打开文件的控制台程序的demo,针对不同文件类型使用不同方式打开。

  在这个案列中多态的要素 “同一行为”在这个实例中指的就是“打开文件”这个行为,打开文本文件和打开音乐文件都是“打开”行为,但是不同文件打开的结果是不一样的。

这里我们可以把“打开文件”这一行为抽象出来,可以抽象成接口、虚方法或抽象类,这里就把这个行为抽象成一个虚方法放在FileBase这个父类中:

class FileBase
    {
        public string file{ get; set; }
        public FileBase(string cmd)
        {
            file = cmd;
        }
        public virtual void open()
        { 
       // 若该类没有被继承,相当于没有明确的文件类型,打开报错 Console.WriteLine(
"{0}无法识别的文件!", file); } }

  创建一个读取音乐文件类MusicFile、文本文件类TxtFile,该类继承于文件父类,并重写打开方法:

 class MusicFile:FileBase
    {
        public MusicFile(string cmd) : base(cmd)
        {

        }

        public override void open()
        {
            Console.WriteLine("这是一个音乐文件,是否要继续打开?Y/N");
            string operation =Console.ReadLine();
            if (operation.ToLower() == "y")
            {
                Console.WriteLine("{0}音乐文件打开成功!",file);
            }
        }
    }


 class TxtFile:FileBase
    {
        public TxtFile(string cmd) : base(cmd)
        {

        }

        public override void open()
        {
            Console.WriteLine("这是一个文本文件,是否要继续打开?Y/N");
            string operation =Console.ReadLine();
            if (operation.ToLower() == "y")
            {
                Console.WriteLine("{0}文本文件打开成功!",file);
            }
        }
    }

  创建一个用于实例化文件的工厂类Factory:

 class Factory
    {
        public static FileBase CreateInstance(string input)
        {
            string ext = Path.GetExtension(input);
            switch (ext.ToLower())
            {
                // 根据文件的扩展名返回对应的文件类
                case ".mp3": return new MusicFile(input);
                case ".txt": return new TxtFile(input);
                default: return new FileBase(input);
            }
        }
    }            

  主函数Program类:

class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("请输入文件路径:");
                string input = Console.ReadLine();
                if (input == "exit")
                {
                    break;
                }
                else
                {
                    //根据输入路径创建对应实例
                    FileBase file = Factory.CreateInstance(input);
                    if (file != null)
                    {
                        file.open();
                    }
                }
            }
        }
    }    

  思路总览: 

posted on 2016-12-08 09:55  njfan  阅读(916)  评论(0编辑  收藏  举报

导航