设计模式-工厂模式(二)
参照: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。
有没有更好的设计呢?