前言

首先关于抽象工厂模式的学习,我们需要慢慢的,由浅入深的进入。不能单刀直入,否则可能达不到预期学明白的目标。

第一回合  

首先我们从最简单的数据访问程序开始吧。

下面先来看一个简单的小例子,代码很简单

public class User
{public int ID{get;set;}public string Name{get;set;}
}

一个简单的实体类,也相当于在SqlServer数据库中建立了相同的数据表

public class SqlServerUser
{public void Insert(User user){Console.WriteLine("在SQL Server 中给User表增加一条记录");}public User GetUser(int id){Console.WriteLine("在SQL Server 中根据ID得到User表一条记录");return null;}
}

然后建立一个类库来操作上面建立的User实体类,也就是向User表中添加一条记录,或者通过ID获得一条记录,两个类库操作方法。

public class Test
{public static void Main(){User user=new User();SqlServerUser su=new SqlServerUser();su.Insert(user);su.GetUser(1);Console.ReadLine();}
}

最后我们通过在控制台程序中进行简单的调用。第一调用插入一条记录,然后通过ID=1获取一条记录。

可以看出,现在的实现非常的简单。那么现在我们来想一个问题。刚刚我们上面的实现是在SQL Server数据库的基础上。那么现在有个需求,是要将现有的数据库SQL Server改为Access数据库的话,我们应该怎么办呢?

SQL Server和Access在ADO.NET上的使用是不同的,在SQL Server上用的是System.Data.SqlClient命名空间下的SqlConnection、SqlCommand、SqlParameter、SqlDataReader、SqlDataAdapter,而Access则要用System.Data.OleDb命名空间下的相应对象,我本以为将其对应的全部替换,局可以使用了,结果替换后,错误百出。

原来两者有不少的地方在使用的时候死不同的。

比如:

1.在插入数据时,Access必须要insert into 而Sql Server可以不用into的;

2.Sql Server中的GetDate()在Access中没有,需要改成Now();

3.Sql Server中字符串含糊Substring,而在Access中根本不能用;

4.这些问题还好了,也不是什么大问题。原来Access对一些关键字,例如password是不能作为数据库的字段的,如果密码的字段名是password,Sql Server 中什么问题都没有,运行正常,在Access中就会报错,而且错误让人莫名其妙。 后来知道了原来关键字应该用‘[’和‘]’包起来,不然当然是容易出错的。

5.主要网站要维护,比如修改或增加一些功能,我们就需要修改两个项目,至少在数据库中做改动,相应的程序代码都要改,甚至和数据库不相干的代码也要改,两个不同的版本,两倍的工作量呀。

6.假如哪天要用Oracle数据库,那又要折腾一阵子了。

现在我们再来分析下刚刚上面的小例子是不能换数据库的,因为就在于SqlServerUser su=new SqlServerUser()使得su这个对象被框死在Sql Server上了。如果这里是灵活的,专业店的说法,是多态的,那么在执行su.Insert(user)和su.GetUser(1)时就不用考虑是在用Sql Server还是在Access。

想一想前面我学习的工厂方法模式,它就是定义一个用于创建对象的接口,让子类决定实例化那一个类。

工厂方法模式来优化数据库访问程序

先来看一下简单的UML类图关系

看上去很简单,下面我们来用代码实现一下:

IUser接口,用于客户端访问,解除与具体数据库访问的耦合。

    public class User{public int ID{get;set;}public string Name{get;set;}}interface IUser{void Insert(User user);User GetUser(int id);}

在建立接口之前,当然要准备好User类。
接下来完成SqlServerUser和AccesssUser

    public class SqlServerUser:IUser{public void Insert(User user){Console.WriteLine("在SQL Server 中给User表增加一条记录");}public User GetUser(int id){Console.WriteLine("在SQL Server 中根据ID得到User表一条记录");return null;}}public class AccessUser : IUser{public void Insert(User user){Console.WriteLine("在Access中给User表增加一条记录");}public User GetUser(int id){Console.WriteLine("在Access中根据ID得到User表一条记录");return null;}}

SqlServerUser类,用于访问Sql Server的User。 AccessUser类,用于访问Access的User。

接下来,建立IFactory接口,定义一个创建访问User表对象的抽象的工厂接口。

    interface IFactory{IUser CreateUser();}

SqlServerFactory类,实现IFactory接口,实例化SqlServerUser.

    public class SqlServerFactory : IFactory{public IUser CreateUser(){return new SqlServerUser();}}

AccessFactory类,实现IFactory接口,实例化AccessUser。

    public class AccessServerFavtory : IFactory{public IUser CreateUser(){return new AccessUser();}}

客户端调用代码

    class Program{static void Main(string[] args){User user = new User();IFactory factory = new SqlServerFactory();IUser iu=factory.CreateUser();iu.Insert(user);iu.GetUser(1);Console.ReadLine();}}

前言

当然现在只是对一个User表的操作,如果再加一个部门表Department表,该如何处理呢,一个网站,一个项目,不可能只有一个表,会有几十张表,甚至更多,那该如何处理呢,这些问题将会在抽象工厂模式的第二回合进行处理。

设计模式之四(抽象工厂模式第一回合)相关推荐

  1. 设计模式之四(抽象工厂模式第二回合)

    前言 在第一回合中留下的问题,http://www.cnblogs.com/aehyok/archive/2013/05/19/3087497.html,现在就先处理一个简单的,只添加一个Depart ...

  2. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  3. 秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)

    [版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86644481 出自:shusheng007 ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  6. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  7. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  8. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  9. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

最新文章

  1. git push throws error: RPC failed; result=22, HTTP
  2. iOS 关于第三方键盘
  3. 学习下如何统计【0-9】在任意给定数中出现的次数
  4. Mac 配置flutter
  5. STM32系列--初识寄存器1
  6. 蓝桥杯-队列操作(java)
  7. python入门需要什么基础知识_Python 基础之:入门必备知识
  8. 同前端联调过程中遇到的坑
  9. Kudu : NonRecoverableException: illegal replication factor 2 (replication factor must be odd)
  10. SSO的几种跨域方案
  11. opencv库skimage 实现Canny边缘探测算法
  12. 转:多线程--六种多线程方法解决UI线程阻塞
  13. eprime2.0 倒计时功能
  14. 安卓谷歌地图离线包_手机卫星地图
  15. 网络书店可行性分析报告
  16. *(uint32_t *)(PERIPH) == GPIOX)
  17. 破解tumblr背景音乐
  18. C#实现百度地图附近搜索调用JavaScript函数
  19. 世界经典咖啡@配制方法
  20. Flutter 中 GestureDetector 的使用误区

热门文章

  1. idea springboot 无法run_2021 最新版 Spring Boot 速记教程
  2. 国睿驰120gb固态硬盘测试软件,系统盘首选 国睿驰120GB固态硬盘测试
  3. quit推不出mysql_cmd下使用mysql插入中文出现无法退出语句的情况!终极解决办法! 安装mysql详细教程。...
  4. java基础知识1---面向对象及final,finally,finalize区别
  5. Android中使用Adapter(适配器)给RecycleView设置数据源
  6. ElementUI中的el-table怎样实现每一列显示的是控件并能动态实现双向数据绑定
  7. Nodejs模块、自定义模块、CommonJs的概念和使用
  8. Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载)
  9. Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中
  10. Tomcat下项目调整Log4J的console输出级别,减少输出信息