当前位置: 首页 > news >正文

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

原文: 设计模式之四(抽象工厂模式第二回合)

前言

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

第二回合

 首先要建立部门类,假设只有两个字段部门ID,和部门名称。

    public class Department
    {
        public int ID { get; set; }

        public string DeptName { get; set; }
    }

下面看一下添加了部门表的UML类图

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

    interface IDepartment
    {
        void Insert(Department department);

        Department GetDepartment(int id);
    }

SqlServerDepartment类,用于访问Sql Server的Department.

    public class SqlServerDepartment : IDepartment
    {

        public void Insert(Department department)
        {
            Console.WriteLine("在Sql Server中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Sql Server中根据ID得到Department表一条记录");
            return null;
        }
    }

AccessDepartment类,用于访问Access的Departmet。

    public class AccessDepartment : IDepartment
    {

        public void Insert(Department department)
        {
            Console.WriteLine("在Access中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据ID得到Department表一条记录");
            return null;
        }
    }

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

    interface IFactory
    {
        IUser CreateUser();

        IDepartment CreateDepartment();
    }

在IFactory接口中又新添加了CreateDepartment()接口方法

SqlServerFactory类,实现IFactory接口,主要是实现Sql Server数据库添加了的部门接口方法。

    public class SqlServerFactory : IFactory
    {

        IUser IFactory.CreateUser()
        {
            return new SqlServerUser();
        }


        public IDepartment CreateDepartment()
        {
            return new SqlServerDepartment();
        }
    }

AccessFactory类,实现IFactory接口,主要是实现Access数据库添加了的部门接口方法。

    public class AccessServerFavtory : IFactory
    {

        IUser IFactory.CreateUser()
        {
            return new AccessUser();
        }


        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }

客户端代码

    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();
            IFactory factory = new AccessFactory();
            IUser iu=factory.CreateUser();
            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();
            id.Insert(dept);
            id.GetDepartment(1);
            Console.ReadLine();
        }
    }

现在如果想切换数据库,只需要IFactory factory = new AccessFactory();修改为IFactory factory=new SqlServerFactory();
只有一个Uer类和User操作类的时候,是只需要工厂方法模式的,但是现在显然你数据库中有很多的表,而Sql Server与Access又是两大不同的分类,所以解决这种涉及多个产品系列的问题,有一个专门的工厂模式叫抽象工厂模式。

总结

 通过第一回合和第二回合的前奏,我们终于可以进入正题了。

 

相关文章:

  • ListView小知识整理:滑动背景、Item间隙等
  • 关于mysql_fetch_****
  • 生成新的内容如何获取当前生成内容的id
  • 锁分类
  • PXE 服务详解
  • 删除字符串中的空格
  • 反编译APK文件
  • 学习日记(一)----BaseActivity的写法
  • 【Android-View】点击侧滑菜单(SlidingMenu)按钮,更新主题内容时容易引发的内存问题解决方案...
  • MySQL正则表达式初步
  • ssh框架整合所需jar包
  • 【cocos2d-x从c++到js】21:使用CocosCode调试JSB
  • Linux下多线程下载工具 - Axel
  • 一个简单的css3 动画例子
  • 串的存储实现
  • 【刷算法】从上往下打印二叉树
  • C++入门教程(10):for 语句
  • DOM的那些事
  • HTTP 简介
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java深入 - 深入理解Java集合
  • Java-详解HashMap
  • java中具有继承关系的类及其对象初始化顺序
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PAT A1017 优先队列
  • php中curl和soap方式请求服务超时问题
  • Python_网络编程
  • underscore源码剖析之整体架构
  • Vue全家桶实现一个Web App
  • Vultr 教程目录
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 聊聊hikari连接池的leakDetectionThreshold
  • 使用agvtool更改app version/build
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过几道题目学习二叉搜索树
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 【干货分享】dos命令大全
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​插件化DPI在商用WIFI中的价值
  • # 飞书APP集成平台-数字化落地
  • #Spring-boot高级
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax()参数及用法
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (6)STL算法之转换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (vue)页面文件上传获取:action地址
  • (九)信息融合方式简介
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例