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

引言

上一篇介绍了设计模式中的简单工厂模式-C#设计模式(2)-简单工厂模式,本篇将介绍工厂方法模式,在简单工厂模式下进行改造;

工厂方法模式简介

工厂方法(FactoryMethod)模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类中;

上一篇简单工厂模式中讲到了其缺点,工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。如果我们增加一个产品,我们就需要在工厂类中增加case分支条件,修改原有的类,这样我们不但对扩展开放了,也对修改开放了,违背了“开放-封闭”原则,所以我们对简单工厂模式进行优化,对工厂抽出一个接口,就有了以下的工厂方法模式

结构图

(来自大话设计模式)

应用实例

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

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

类图

代码实例

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

创建数据操作抽象类

以新增、更新为例;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FactoryMethod
{
/// <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 FactoryMethod
{
/// <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 FactoryMethod
{
/// <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工厂接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FactoryMethod
{
/// <summary>
/// DB工厂接口
/// </summary>
public interface IDbFactory
{
/// <summary>
/// 创建db操作实例
/// </summary>
/// <returns></returns>
AbstractDataBaseOpr CreateDbOpr();
}
}

Oracle工厂类

实现接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FactoryMethod
{
/// <summary>
/// oracle db工厂
/// </summary>
public class OracleDbFactory : IDbFactory
{
/// <summary>
/// 创建数据库操作实例
/// </summary>
/// <returns></returns>
public AbstractDataBaseOpr CreateDbOpr()
{
return new OracleDbOpr();
}
}
}

SqlServer工厂类

实现接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FactoryMethod
{
/// <summary>
/// SqlServer db工厂
/// </summary>
public class SqlServerDbFactory : IDbFactory
{
/// <summary>
/// 创建数据库操作实例
/// </summary>
/// <returns></returns>
public AbstractDataBaseOpr CreateDbOpr()
{
return new SqlServerDbOpr();
}
}
}

业务调用

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FactoryMethod
{
class Program
{
static void Main(string[] args)
{
//oracle操作
IDbFactory dbFactory1 = new OracleDbFactory();
AbstractDataBaseOpr opr1 = dbFactory1.CreateDbOpr();
opr1.Insert();
opr1.Update(); Console.WriteLine("-----------------------------------------"); //切换为sqlserer
IDbFactory dbFactory2 = new SqlServerDbFactory();
AbstractDataBaseOpr opr2 = dbFactory2.CreateDbOpr();
opr2.Insert();
opr2.Update(); Console.ReadKey();
}
}
}

调用结果

优缺点

优点

  • 用户只需要关心所需产品对应的工厂,不需要关注如何创建。
  • 在增加新产品时,需要增加新的产品类及对应的工厂类,不会影响其它产品,符合开闭原则

缺点

当需要增加新产品的时候,需要增加新的产品类,还需要增加对应的工厂类

C#设计模式(3)-工厂方法模式的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  3. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  4. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  5. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  6. java 23 - 1 设计模式之工厂方法模式

    转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

  7. Java设计模式 之 工厂方法模式

    1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性. 2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂 ...

  8. Android设计模式系列--工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...

  9. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

  10. 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)

    上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...

随机推荐

  1. php如何上传txt文件,并且读取txt文件

    1.创建目录如下

  2. GNU的makefile文件编写说明

    这篇文章讲的相当详细,转来收藏: linux下Makefile学习 MAC

  3. Nio经典工作方式

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...

  4. js中各个类型的转换总结

    字符串转换为数组:   1 正则表达式var string=“abcdedef”var obj=string.replace(/(.)(?=[^$])/g,"$1,").split ...

  5. spring auto-config

    spring security auto-config auto-config配置 <http auto-config="true"> </http> 自动 ...

  6. Redis事务原理分析

    Redis事务原理分析 基本应用 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD ...

  7. BottomupSort算法 c++代码实现

    #include <iostream> using namespace std; #define N 100 int A[N]; static int n; void Initial() ...

  8. MySQL-FAQ

    1.ERROR 1130: Host 'xxx' is not allowed to connect to this MySQL server远程连接mysql服务器报上述错误.解决方法:1.改表法. ...

  9. gulp环境搭建

    简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:它不仅对网站资源进行优化,而且在开发过程中很多重复的任务,他可以通过明确的工具自动完成,使用它我们不仅可以很愉快的编写代码 ...

  10. 有关各个版本的Visual Studio(VS)和SQL Server安装的顺序总结

    前几天从网上买了块三星的SSD,把原来的HDD放在了光驱位,然后重新安装了系统.想起来收集储存的好多源代码还是VS2008开发的,然后打算把之前用过的VS2008也装上,安装过程出了点问题.发现安装完 ...