引言
上一遍中介绍了设计模式中的单例模式-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 }
工厂类
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(); } } }
调用结果
简单工厂模式的优缺点
优点
- 工厂类中包含了必要的判断逻辑,根据客户端选择条件,动态实例化相关的类。
- 简单工厂模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的的参数即可。
缺点
- 工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。
- 增加新产品必须修改工厂角色的源码,同时需要增加产品实现类;