工厂方法模式(Factory Method)是一种常用的类创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
通过工厂方法来解决简单工厂带来的一些弊端
我们都知道,简单工厂最大的弊端就是严重违背了设计模式六大原则中的“单一职责原则”,当然,对于游戏这个门派还是比较稳定的,如果把这个游戏门派换成手机型号的话,那可想而知,动不动就要去修改一下工厂中的方法,而又违背了设计模式六大原则中的“开闭原责”。那么怎么来解决这一类问题呢,工厂方法就可以实现这一点。
核心结构之-抽象工厂
/// <summary> /// 抽象工厂 /// </summary> public interface IFactory { ISects CreateInstance(); }
核心结构之-具体工厂
/// <summary> /// 创建金系门派工厂 /// </summary> public class GoldFactory: IFactory { public ISects CreateInstance() { return new Gold(); } }
/// <summary> /// 创建木系门派工厂 /// </summary> public class WoodFactory: IFactory { public ISects CreateInstance() { return new Wood(); } }
/// <summary> /// 创建水系门派工厂 /// </summary> public class WaterFactory: IFactory { public ISects CreateInstance() { return new Water(); } }
核心结构之-抽象产品
/// <summary> /// 门派接口(抽象产品) /// </summary> public interface ISects { /// <summary> /// 技能 /// </summary> void Skill(); }
核心结构之-具体产品
/// <summary> /// 金系门派 /// </summary> public class Gold : ISects { public void Skill() { Console.WriteLine("金系门派技能:金光乍现"); } }
/// <summary> /// 木系门派 /// </summary> public class Wood : ISects { public void Skill() { Console.WriteLine("木系门派技能:摘叶飞花"); } }
/// <summary> /// 水系门派 /// </summary> public class Water : ISects { public void Skill() { Console.WriteLine("水系门派技能:滴水穿石"); } }
以上就是核心结构的四个角色,接下来就是调用了。
try { var goldFactory = new GoldFactory(); var gold = goldFactory.CreateInstance(); gold.Skill(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey();
结果如下:
作为演示项目,这里调用不设计DI,但实际用于项目中时,可以借助DI组件来实现依赖注入。