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):通过对产品类的抽象使其创建 ...
随机推荐
- GCD 信号量 dispatch_semaphore_t
1.GCD知识讲解 1)dispatch_semaphore_create(long value) //创建一个信号量,总量为value,value不能小于0 2)dispatch_semaphore ...
- LinkedList原理及源码解析
简介 LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度, ...
- Java泛型概念
1. 概述在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成List<Objec ...
- 将HTML导出生成word文档
前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...
- python编程快速上手之第4章实践项目参考答案
#!/usr/bin/env python3.5 # coding:utf-8 # 假定有一个列表,编写函数以一个列表值作为参数,返回一个字条串 # 该字符串包含所有表项,之间以逗号和空格分隔,并在最 ...
- C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法
c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...
- java基础06 Java中的递归
一.递归是指直接或间接地调用自身. 二.递归的注意事项: A:要有出口,否则就是死递归 B:次数不能过多,否则内存溢出 C:构造方法不能递归使用 三.举例子 递归 ...
- 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
- Java 9 揭秘(12. Process API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...
- python数据可视化(matplotlib)