点击这里查看全部设计模式系列文章导航

引言

上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式;本文将以多数据库操作为例进行讲解;

简单工厂模式简介

什么是简单工厂模式?

    定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式,它属于创建型模式。

   在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类;

应用实例

   现在市面上很多种数据库,Oracle、SqlSever、Mysql等;比如我们现在需要写一个通用的数据处理,如新增、更新等操作,能够达到切换任意一个数据库,都能够调用对应版本数据库的的新增或者更新操作;

下面的类图、代码将以数据库操作为实例;

类图

代码实例

注:这里实例仅做示例,不包含逻辑;

创建数据操作抽象类

以新增、更新为例;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
    /// <summary>
    /// 数据库操作抽象类
    /// </summary>
    public abstract class AbstractDataBaseOpr
    {
        /// <summary>
        /// 新增
        /// </summary>
      public  abstract bool Insert();

        /// <summary>
        /// 更新
        /// </summary>
        /// <returns></returns>
      public abstract bool Update();
    }
}

Oracle数据操作类

继承上述数据库操作抽象类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
    /// <summary>
    /// oracle操作
    /// </summary>
    public class OracleDbOpr : AbstractDataBaseOpr
    {
        /// <summary>
        /// 新增
        /// </summary>
        public override bool Insert()
        {
            Console.WriteLine("Oracle新增记录");
            return true;
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <returns></returns>
        public override bool Update()
        {
            Console.WriteLine("Oracle更新记录");
            return true;
        }

    }
}

SqlServer数据操作类

继承上述数据库操作抽象类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
    /// <summary>
    /// sqlServer操作
    /// </summary>
    public class SqlServerDbOpr : AbstractDataBaseOpr
    {
        /// <summary>
        /// 新增
        /// </summary>
        public override bool Insert()
        {
            Console.WriteLine("SqlServer新增记录");
            return true;
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <returns></returns>
        public override bool Update()
        {
            Console.WriteLine("SqlServer更新记录");
            return true;
        }

    }
}

DB工厂类

这里先定义一个数据库枚举类

 1 namespace SimpleFactory
 2 {
 3     /// <summary>
 4     /// 数据库类型枚举
 5     /// </summary>
 6     public enum DatabaseTypeEnum
 7     {
 8         /// <summary>
 9         /// 数据库类型:SqlServer
10         /// </summary>
11         SqlServer,
12         /// <summary>
13         /// 数据库类型:MySql
14         /// </summary>
15         MySql,
16         /// <summary>
17         /// 数据库类型:Oracle
18         /// </summary>
19         Oracle,
20         /// <summary>
21         /// 数据库类型:Access
22         /// </summary>
23         Access,
24         /// <summary>
25         /// 数据库类型:SQLite
26         /// </summary>
27         SQLite
28     }
29 }
View Code

工厂类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
    /// <summary>
    /// DB工厂类
    /// </summary>
    public class DbFactory
    {
        /// <summary>
        /// 创建数据库操作实例
        /// </summary>
        /// <param name="dbType"></param>
        /// <returns></returns>
        public static AbstractDataBaseOpr Create(DatabaseTypeEnum dbType)
        {
            AbstractDataBaseOpr dbOpr = null;
            switch (dbType)
            {
                case DatabaseTypeEnum.Oracle:
                    dbOpr = new OracleDbOpr();
                    break;
                case DatabaseTypeEnum.SqlServer:
                    dbOpr = new SqlServerDbOpr();
                    break;
            }
            return dbOpr;
        }
    }
}

业务调用

oracle数据库和sqlserver数据库操作分别调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleFactory;

namespace SimpleFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            //oracle操作
            AbstractDataBaseOpr dbOpr1 = DbFactory.Create(DatabaseTypeEnum.Oracle);
            dbOpr1.Insert();
            dbOpr1.Update();

            Console.WriteLine("-----------------------------------------");

            //SqlServer操作
            AbstractDataBaseOpr dbOpr2 = DbFactory.Create(DatabaseTypeEnum.SqlServer);
            dbOpr2.Insert();
            dbOpr2.Update();

            Console.ReadKey();
        }
    }
}

调用结果

简单工厂模式的优缺点

优点

  • 工厂类中包含了必要的判断逻辑,根据客户端选择条件,动态实例化相关的类。
  • 简单工厂模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的的参数即可。

缺点

  • 工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。
  • 增加新产品必须修改工厂角色的源码,同时需要增加产品实现类;
posted on 2017-08-14 16:57  yxtic  阅读(470)  评论(2编辑  收藏  举报