zoukankan      html  css  js  c++  java
  • C#设计模式(2)-简单工厂模式

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

    引言

    上一遍中介绍了设计模式中的单例模式-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();
            }
        }
    }

    调用结果

    简单工厂模式的优缺点

    优点

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

    缺点

    • 工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。
    • 增加新产品必须修改工厂角色的源码,同时需要增加产品实现类;
  • 相关阅读:
    11.28 正则表达式
    12.28jQuery 的取值赋值
    11.27 上传下载 图片预览
    11.28 验证控件
    12.23,repeater 分页显示
    12.23,搜索标记
    1.基础CRUD
    C#杀进程与之之子进程
    使用procedump捕获未处理异常的dump
    [.net core] 12.环境变量
  • 原文地址:https://www.cnblogs.com/yx007/p/SimpleFactoryPattern.html
Copyright © 2011-2022 走看看