工厂方法模式的介绍
简单工厂模式中解决了调用类强依赖实现类的情况,但是简单工厂模式存在弊端,如果需要增加新的实现就需要修改工厂实现方法。这不符合开闭原则,对扩展开放对修改屏蔽。对于已经正常运行的功能代码修改会带来不确定性,应该尽量避免修改已有代码而是通过扩展的方式修改原有功能。
工厂方法模式的用途
工厂方法模式的用途与简单工厂模式用途相同,降低功能类和调用类的强依赖关系。
工厂方法模式的思路
修改原有简单工厂代码中的工厂类,新工厂类已抽象类作为返回值,返回不同实现的具体实例
C# 实现代码
/// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary> public class TomatoScrambledEggs : Food { public override void Print() { Console.WriteLine("一份西红柿炒蛋!"); } } /// <summary> /// 土豆肉丝这道菜 /// </summary> public class ShreddedPorkWithPotatoes : Food { public override void Print() { Console.WriteLine("一份土豆肉丝"); } } /// <summary> /// 调用方 /// </summary> public class Customer { public static void CreateFood() { // 客户想点一个西红柿炒蛋 #region 简单工厂模式 Food food1 = SimpleFactory.CreateFood("西红柿炒蛋"); food1.Print(); // 客户想点一个土豆肉丝 Food food2 = SimpleFactory.CreateFood("土豆肉丝"); food2.Print(); #endregion #region 工厂方法模式 Creator tomatorFactory = new TomatoScrambledEggsFactory(); tomatorFactory.CreateFoddFactory().Print(); Creator shreddedPorkFactory = new ShreddedPorkWithPotatoesFactory(); shreddedPorkFactory.CreateFoddFactory().Print(); #endregion Console.Read(); } } /// <summary> /// 简单工厂类 /// </summary> public class SimpleFactory { /// <summary> /// 根据菜名创建具体的实例 /// </summary> /// <param name="type"></param> /// <returns></returns> public static Food CreateFood(string type) { Food food = null; if (type.Equals("土豆肉丝")) { food = new ShreddedPorkWithPotatoes(); } else if (type.Equals("西红柿炒蛋")) { food = new TomatoScrambledEggs(); } return food; } } /// <summary> /// 抽象工厂类 /// </summary> public abstract class Creator { // 工厂方法 public abstract Food CreateFoddFactory(); } /// <summary> /// 西红柿炒蛋工厂类 /// </summary> public class TomatoScrambledEggsFactory : Creator { /// <summary> /// 负责创建西红柿炒蛋这道菜 /// </summary> /// <returns></returns> public override Food CreateFoddFactory() { return new TomatoScrambledEggs(); } } /// <summary> /// 土豆肉丝工厂类 /// </summary> public class ShreddedPorkWithPotatoesFactory : Creator { /// <summary> /// 负责创建土豆肉丝这道菜 /// </summary> /// <returns></returns> public override Food CreateFoddFactory() { return new ShreddedPorkWithPotatoes(); } }
正文完