工厂方法
接上篇简单工厂模式进行改进。
由于简单工厂模式违背开-闭原则,弹性太弱,例如增加一种鸟类,会造成修改类(工厂类)
好的实现应该是增加一种鸟类不影响现有类的修改。
思路:
在简单工厂的基础上我们增加一个抽象类(基础抽象类),并且在基础抽象工厂类中必须要定义一个抽象方法用来获取所有鸟类的抽象基类,然后使其被其他各鸟类的工厂类继承,这样实现之后,客户端实例华某鸟类的工厂赋给基础抽象工厂类,用基础抽象工厂类间接获取到实例华对象。
实现代码:
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 abstract class Factory { public abstract Bird GetBird(); } //**********************************其他工厂类 /// <summary> /// 老鹰工厂 /// </summary> public class EagleFactory : Factory { public override Bird GetBird() { return new Eagle(); } } /// <summary> /// 鸵鸟工厂 /// </summary> public class OstrichFactory : Factory { public override Bird GetBird() { return new Ostrich(); } } /// <summary> /// 麻雀工厂 /// </summary> public class SparrowFactory : Factory { public override Bird GetBird() { return new Sparrow(); } } }
客户端:
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"); Factory factory; Bird instance; //首先要实例化一个麻雀工厂赋给基础工厂 factory = new SparrowFactory(); //通过基础工厂获得麻雀对象 instance = factory.GetBird(); var sparrow = instance as Sparrow;//as不仅可以当类型转换也可以充当类型判断 if (sparrow != null)//如果是麻雀,执行麻雀特有的Eat方法, { sparrow.Eat(); } instance.Feather(); instance.Wing(); //首先要实例化一个老鹰工厂赋给基础工厂 factory = new EagleFactory(); //通过基础工厂获得老鹰对象 instance = factory.GetBird(); instance.Feather(); instance.Wing(); Console.ReadLine(); } } }
效果:
作者:Chaunce
GitHub:https://github.com/liuyl1992
公众号请搜:架构师高级俱乐部 SmartLife_com
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能等盈利行为