深入学习《大话设计模式》 简单工厂模式

时间:2020-01-12 23:29:00 来源:互联网 作者: 神秘的大神 字体:

简单工厂模式

定义:封装改变,既然要封装改变,自然也就要找到需要更改的代码,然后将需要更改的代码用类来封装,这样的思路就是我们简单工厂模式的实现方式了

下面我们通过一则小故事来简述一下我们在项目中为什么要使用简单工厂模式

背景

橙子同学正在兴高采烈的逛着博客园,学习着大佬的一些操作,突然发现微信闪动了一下。点开一看,然来是万恶的产品经理给橙子同学发来一条消息,说有个新的需求需要橙子同学来实现一些,巴拉巴拉一大堆,在最后和橙子同学说由于最近经济不景气,公司要节约开支,所以在数据库方面我们就选用mysql数据库吧。(ps:橙子同学心想:抠门的公司,在项目开发上都不舍得花钱,怪不得这个月的水果日没了),橙子同学微笑着对产品经理说,好的,遵从公司的安排。就进入了项目开发。
熬到第二天早上九点。双眼失神的对产品经理说。产品完成了,数据库也是使用的mysql数据库,我先回去休息了,产经理品先浏览了一遍产品功能,就说,橙子同学还是厉害了,不过数据库方面可能需要稍微改一下,由于第三方要求我们使用sqlserver数据库。橙子同学愣了一会(内心ps:唉,果然是万恶的产品经理),也没有和产品经理争论,毕竟程序员的高傲还是要有的。于是橙子同学开启了第二次的编码过程

代码示例

调用方


  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*******mysql连接");
            var mysqlSimpleFactory = DBFactory.CreateConnetion(DBConnetionEnum.Mysql);
            var mysqlConnection = mysqlSimpleFactory.DBConnection();
            Console.WriteLine(mysqlConnection);

            Console.WriteLine("*******sqlserver连接");
            var sqlServerSimpleFactory = DBFactory.CreateConnetion(DBConnetionEnum.SqlServer);
            var sqlserverConnection = sqlServerSimpleFactory.DBConnection();
            Console.WriteLine(sqlserverConnection);

            Console.ReadKey();
        }
    }

创建数据库工厂,用来返回数据库实例


   /// <summary>
    /// 数据库工厂
    /// </summary>
    public class DBFactory
    {
        public static ConnetionAbstract CreateConnetion(DBConnetionEnum dBConnetionEnum)
        {
            ConnetionAbstract connetion = null;
            connetion = dBConnetionEnum switch
            {
                DBConnetionEnum.Mysql => new MysqlConnetion(),
                DBConnetionEnum.SqlServer => new SqlServerConnetion(),
                _ => throw new Exception("数据库类型错误"),
            };
            return connetion;
        }
    }

定义连接抽象类


   /// <summary>
    /// 连接抽象类
    /// </summary>
    public abstract class ConnetionAbstract
    {
        /// <summary>
        /// 数据库连接
        /// </summary>
        /// <returns></returns>
        public abstract string DBConnection();
    }

实现mysql数据库连接


    /// <summary>
    /// Mysql数据库连接
    /// </summary>
    public class MysqlConnetion : ConnetionAbstract
    {
        public override string DBConnection()
        {
            return "我是Mysql连接";
        }
    }

实现sqlserver数据库连接


    /// <summary>
    /// SqlServer数据库连接
    /// </summary>
     public class SqlServerConnetion : ConnetionAbstract
    {
        public override string DBConnection()
        {
            return "我是SqlServer连接";
        }
    }

数据库对应枚举


   /// <summary>
    /// 数据库连接枚举
    /// </summary>
    public enum DBConnetionEnum
    {
        /// <summary>
        /// mysql
        /// </summary>
        Mysql = 0,

        /// <summary>
        /// sqlserver
        /// </summary>
        SqlServer = 1,

    }

以上就是橙子同学最后编写的代码。最后不管第三方要求用什么数据库,橙子同学只需要在调用的地方进行修改就可以。

最后总结一下使用简单工厂的优点,缺点和使用场景

简单工厂模式优点

  • 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是使用。简单工厂模式实现了对责任的分割

  • 简单工厂也起到了代码复用的作用,消费者只需要调用工厂就可以,而不需要直接去参与创建对象

简单工厂模式缺点

  • 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响

  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,会造成工厂逻辑复杂

适用场景

  • 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式

  • 客户如果只知道创建工厂类的参数,对于如何创建对象的逻辑不关心是可以考虑使用简单工厂模式

以上就上橙子同学和产品经理的第一则小故事啦,让我们一起期待橙子同学和产品经理的第二则小故事吧
源码github地址:https://github.com/1301536601/DesignMode.git
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧