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

引言

上一遍中介绍了设计模式中的单例模式-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工厂类

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

 namespace SimpleFactory
{
/// <summary>
/// 数据库类型枚举
/// </summary>
public enum DatabaseTypeEnum
{
/// <summary>
/// 数据库类型:SqlServer
/// </summary>
SqlServer,
/// <summary>
/// 数据库类型:MySql
/// </summary>
MySql,
/// <summary>
/// 数据库类型:Oracle
/// </summary>
Oracle,
/// <summary>
/// 数据库类型:Access
/// </summary>
Access,
/// <summary>
/// 数据库类型:SQLite
/// </summary>
SQLite
}
}

工厂类

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();
}
}
}

调用结果

简单工厂模式的优缺点

优点

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

缺点

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

C#设计模式(2)-简单工厂模式的更多相关文章

  1. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...

  2. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  3. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  4. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  5. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  6. php实现设计模式之 简单工厂模式

    作为对象的创建模式,用工厂方法代替new操作. 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 工厂 ...

  7. [python实现设计模式]-3.简单工厂模式-触宝开放平台

    预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...

  8. C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...

  9. C#设计模式之简单工厂模式

    简单工厂模式解释:  简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一 ...

随机推荐

  1. 【LeetCode】98. Validate Binary Search Tree

    题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...

  2. 【Android Developers Training】 2. 运行你的应用

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 62. 搭建一个OpenGL ES环境

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 全选与单选chekbox的自定义实现(angular框架)

    2017年7月4日,我原本可以像其他同时一样早点回家,玩几把王者荣耀,但是我没有,因为我选择留下来,写一篇博客. 项目中经常性的会遇到什么点击"全选"按钮,勾中所有"单选 ...

  5. h1b期间回国须知

    今天才搞明白几点 1. visa 和 status 是两个不同的东西,status能保证合法在美国.visa能保证合法进入美国 所以,h1b十月份的身份转换时status的转换,如果回国还需要重新办h ...

  6. 【原】无脑操作:Windows 10 + MySQL 5.5 安装使用及免安装使用

    本文介绍Windows 10环境下, MySQL 5.5的安装使用及免安装使用 资源下载: MySQL安装文件:http://download.csdn.net/detail/lf19820717/9 ...

  7. Java 异常Exception e中e的getMessage()和toString()以及 e.printStackTrace();方法的区别

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo {     private static String ...

  8. Servlet 中为多项选择题判分---String类的indexOf()方法妙用

    首先来看一下String类的indexOf()方法的用法: public class FirstDemo1 { /** *API中String的常用方法 */ // 查找指定字符串是否存在 publi ...

  9. Angularjs Material

    公司用Angularjs Material进行开发,之前在网站上看了一些Demo,做一个学习的整理. 1.新建窗体的数据绑定 1.1修改kendo表格新增页面按钮,添加按钮,并Dialog一个窗体 t ...

  10. laravel数据库查询返回的数据形式

    版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(), ...