反射+抽象工厂模式

这里通过一个DEMO介绍反射配合抽象工厂模式的运用。大概业务背景就是在实际业务过程中,可能要替换数据库,具体代码如下:

1、User实体类

class User
    {
        private int id;
        private string name;
        public int Id {
            get { return id; }
            set { id = value; }
        }
        public string Name {
            get { return name; }
            set { name = value; }
        }
    }

2、操作User实体的接口类

interface IUserDao
    {
         void Insert(User user);
         User GetUser(int id);
    }

3、实际数据库操作类

 class SqlServerImpl:IUserDao
    {

        public void Insert(User user)
        {
            Console.WriteLine("向SqlServer插入用户!");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("向SqlServer获取用户");
            return null;
        }
    }

class AccessImpl:IUserDao
    {

        public void Insert(User user)
        {
            Console.WriteLine("向Access插入用户!");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("向Access获取用户");
            return null;
        }
    }

4、数据库中间件

class DataAccess
    {
        private static readonly string DB = ConfigurationSettings.AppSettings["DB"];
        private static readonly string AssemblyName = "反射抽象工厂";
        public static IUserDao CreateUser()
        {
            string className = AssemblyName + "." + DB + "Impl";
            return (IUserDao)Assembly.Load(AssemblyName).CreateInstance(className);
        }

    }

5、配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
  <appSettings>
    <add  key ="DB" value ="Access"/>
  </appSettings>
</configuration>

6、客户端调用

IUserDao userDao = DataAccess.CreateUser();
            userDao.GetUser(1);
            userDao.Insert(new User());

使用此设计模式,可以将数据库直接通过配置文档修改替换,实现对修改关闭,对扩展开放

时间: 2024-08-25 12:06:13

反射+抽象工厂模式的相关文章

C#之三十九 抽象工厂模式

在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 重点: ?      抽象工厂模式概念 ?      抽象工厂模式的模型图 ?      抽象工厂模式访问多种数据库 预习功课: ?      什么是抽象工厂模式 ?  

工厂模式——抽象工厂模式(+反射)

这里又出现了一个抽象工厂模式,这个抽象工厂模式又是什么呢? 我们现在来模拟一个场景,现在用的是Mysql数据库,明天让你更换为Oracle数据库.此时,想想要做多少的改动.但我们如果用工厂模式,这会让你节省大量时间. 首先,我们用工厂方法模式来设计这个程序. 我们画出类的UML图. IFactory作为工厂类的接口,有两个子类,分别用来构造不同的实例. IFactory工厂接口代码如下: package day_3_facoryMethod_db; /** * 数据库工厂类 * @author

抽象工厂模式(JAVA反射)

实例代码(JAVA):模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象. 为了更清晰地理解工厂方法模式,需要先引入两个概念: ? 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

学习日记之抽象工厂模式和Effective C++

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口.而无需制定他们详细的类. (1),工厂方法模式是定义一个用于创建对象的接口.让子类决定实例化哪一个类. (2),为创建不同的产品对象,client应使用不同的详细工厂. 抽象工厂模式的长处和缺点: (1).优点是便于交换产品系列,因为详细工厂类在一个应用中仅仅须要在初始化的时候出现一次,这就使得改变一个应用的详细工厂变得很easy.它仅仅须要改变详细工厂就可以使用不同的产品配置. (2),它让详细的创

抽象工厂模式和autofac的使用总结

抽象工厂模式和依赖注入的使用目的都是降低对象直接依赖耦合关系,应该说依赖注入是抽象工厂模式的一种升华,功能更强大. 说到抽象工厂的模式,一般都要先解释下简单工厂,简单工厂就是将对象的实例化抽取出来形成创建对象的容器.这个只是做了简单的代码重构的一种方式,谈不上模式之言. 抽象工厂实现方式是向客户端提供一个接口,使客户端不要指定具体产品对象,创建多个产品族的产品对象.将具体实例的创建延迟到对应实现的子类中. 抽象内部区别不同对象实例化可以用反射创建指定具体产品实例. autofac是依赖注入第三方