82602411 2016-11-22
工厂模式概念:
首先从文字上理解 工厂通常都是用于生产产品的,而对于产品的用户是不关心生产流程的,只关心最后生产出来的结果,而在代码中工厂类通常用于实例化具体的类并返回类的实例给调用者,使得调用者不用关心这个实例化的过程是怎样的,得到实例后只管用就好。
设计过程:
我们以鸟这一生物种类来举例,先定义了Bird基类 所有的鸟肯定都是有羽毛与翅膀的, 所以我们定义这两个方法Feather(羽毛) 与Wing(翅膀),然后让各种具体的鸟(Ostrich,Sparrow,Eagle)去继承Bird基类并选择性的重写基类方法,因为并不是所有鸟类羽毛翅膀都是一至的。然后通过Factory(工厂类)来创建客户端所需要的具体实例。
实现:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { /// <summary> /// 定义工厂的接口规范所有不同类型的工厂类 /// </summary> /// <summary> /// 所有鸟类的抽象基类 /// </summary> public abstract class Bird { public virtual void Feather() { Console.Write("我有羽毛了\r\n"); } public abstract void Wing(); } /// <summary> /// 老鹰 /// </summary> class Eagle : Bird { public override void Wing() { Console.Write("我是老鹰我,翅膀很结实!\r\n"); } } /// <summary> /// 鸵鸟 /// </summary> public class Ostrich : Bird { public override void Wing() { Console.Write("我是驼鸟有翅膀也不能飞!\r\n"); } } /// <summary> /// 麻雀 /// </summary> class Sparrow : Bird { public override void Feather() { Console.Write("我是麻雀我的羽毛是麻色的!\r\n"); } public override void Wing() { Console.Write("我是麻雀,我是zhizhiz的飞!\r\n"); } public void Eat() { Console.Write("我是麻雀,我吃屎!\r\n"); } } //**********************************工厂 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; } } }
客户端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { class Program { static void Main(string[] args) { Console.WriteLine("输入要生成鸟~~ Eagle Ostrich Sparrow"); string item = Console.ReadLine().Trim(); Bird instance = Factory.CreateInstance(item); var sparrow = instance as Sparrow;//as不仅可以当类型转换也可以充当类型判断 if (sparrow != null)//如果是麻雀,执行麻雀特有的Eat方法, { sparrow.Eat(); } instance.Feather(); instance.Wing(); Console.ReadLine(); } } }
效果:
如果看了工厂类,里面充斥着Switch,目前还不是准确的工厂模式,下一次有时间继续实现标准的工厂方法