设计模式之-工厂方法模式

工厂方法模式(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组件来实现依赖注入。

源代码地址:https://github.com/houzhenhuang/DesignPattern

posted @ 2019-02-12 14:45  黄厚镇  阅读(150)  评论(0编辑  收藏  举报