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(); } } } } }
思路总览: