C#设计模式(3)-工厂方法模式
引言
上一篇介绍了设计模式中的简单工厂模式-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)-工厂方法模式的更多相关文章
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- php设计模式之工厂方法模式
php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- Java设计模式 之 工厂方法模式
1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性. 2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂 ...
- Android设计模式系列--工厂方法模式
工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
1. 模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...
- 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)
上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...
随机推荐
- 【LeetCode】327. Count of Range Sum
题目: Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusiv ...
- 并发编程(三):从AQS到CountDownLatch与ReentrantLock
一.目录 1.AQS简要分析 2.谈CountDownLatch 3.谈ReentrantLock 4.谈消费者与生产者模式(notfiyAll/wait.si ...
- Centos操作系统在虚拟机VMware上的安装
1.下载centos操作系统,提供百度云盘链接:http://pan.baidu.com/s/1pLHOR03 2.打开上篇在VMware中新建好的空白虚拟机,将centos安装在此空白虚拟机上,步骤 ...
- CentOS升级Python到2.7版本
查看python的版本 1 python -V Python 2.4.3 1.先安装GCC 1 yum -y install gcc 2.下载Python-2.7.2 1 wget http://py ...
- requireJS 源码(三) data-main 的加载实现
(一)入口 通过 data-main 去加载 JS 模块,是通过 req(cfg) 入口去进行处理的. 为了跟踪,你可以在此 加断点 进行调试跟踪. (二) req({ })执行时,functio ...
- 将git版本号编译进程序
问题的提出 不管是什么版本管理工具,每一条提交记录都会有一个对应的版本号,一般是一个整数,git是一个hash字符串.不管怎样,这个版本号是唯一的,有时候我们在程序运行的时候会在日志里面输出程序的版本 ...
- Broker模块划分
本篇在上一篇<消息中间件架构讨论>的基础上分析Broker的模块划分. 上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),几点基础: Broker采用主从结构 Broker负责 ...
- 禁用Ubuntu 15.04登录界面显示客人会话
在控制台打开如下配置文件,如果没有就自己创建一个: sudo vi /etc/lightdm/lightdm.conf 向文件中添加如下内容: [SeatDefaults] greeter-sessi ...
- 字符串查找KMP算法
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置.例如,在abab ...
- 关于position
一.position 一)语法: 看了那么久的语法,终于到了讲正题的时间了. 二)定位 1.相对定位:相对元素自己在没有定位之前的位置进行位移,元素仍然保留还没有原来的位置. 特性: 1)不脱离文档流 ...