参照: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。
有没有更好的设计呢?