C#设计模式(2)-简单工厂模式

来源:互联网 发布:鼎丰汽车租赁软件 编辑:程序博客网 时间:2024/06/11 01:57

引言

上一遍中介绍了设计模式中的单例模式-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         /// 数据库类型:SqlServer10         /// </summary>11         SqlServer,12         /// <summary>13         /// 数据库类型:MySql14         /// </summary>15         MySql,16         /// <summary>17         /// 数据库类型:Oracle18         /// </summary>19         Oracle,20         /// <summary>21         /// 数据库类型:Access22         /// </summary>23         Access,24         /// <summary>25         /// 数据库类型:SQLite26         /// </summary>27         SQLite28     }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();        }    }}

调用结果

简单工厂模式的优缺点

优点

  • 简单工厂模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的的参数即可。

缺点

  • 工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。
  • 增加新产品必须修改工厂角色的源码,同时需要增加产品实现类;
原创粉丝点击