利用简单工厂模式来改进抽象工厂使用的复杂性(抽象工厂详见 设计模式之—抽象工厂模式

数据表(User)业务处理接口(IUser)

namespace FactoryMethodPatternDB.CLASS
{
interface IUser
{
void Insert(User user);
void GetUser(string id);
}
}

数据表(Department)业务处理接口(IDepartment)

namespace FactoryMethodPatternDB.CLASS
{
interface IDepartment
{
void Insert(Department dept);
void GetDept(string id);
}
}

SQL操作表(User)类(SqlServerUser)

namespace FactoryMethodPatternDB.CLASS
{
class SqlServerUser:IUser
{
public void Insert(User user)
{
Console.WriteLine("在User表中插入一条数据{0}!SQL数据库",user);
} public void GetUser(string id)
{
Console.WriteLine("通过{0}来查找数据!SQL数据库", id);
}
}
}

SQL操作表(Department)类(SqlServerDepartment)

namespace FactoryMethodPatternDB.CLASS
{
class SqlServerDepartment:IDepartment
{
public void Insert(Department dept)
{
Console.WriteLine("在{0}表中插入数据!SQL数据库", dept);
}
public void GetDept(string id)
{
Console.WriteLine("通过{0}查找数据库表!SQL数据库", id);
} }
}

ACCESS操作表(User)类(AccessUser)

namespace FactoryMethodPatternDB.CLASS
{
class AccessUser:IUser
{
public void Insert(User user)
{
Console.WriteLine("在{0}表中插入数据!Access数据库",user);
}
public void GetUser(string id)
{
Console.WriteLine("通过{0}查找数据库表!Access数据库",id);
}
}
}

ACCESS操作表(Department)类(AccessDepartment)

namespace FactoryMethodPatternDB.CLASS
{
class AccessDepartment:IDepartment
{
public void Insert(Department dept)
{
Console.WriteLine("在{0}表中插入数据!Access数据库", dept);
}
public void GetDept(string id)
{
Console.WriteLine("通过{0}查找数据库表!Access数据库", id);
}
}
}

工厂接口和工厂类被SelectDB替换:

namespace FactoryMethodPatternDB
{
class SelectDB
{
//private static readonly string db = "Sqlserver";
private static readonly string db = "Access";
public static IUser CreateUser()
{
IUser iuser = null;
switch (db)
{
case "Sqlserver":
iuser = new SqlServerUser();
break;
case "Access":
iuser = new AccessUser();
break;
}
return iuser;
} public static IDepartment CreateDept()
{
IDepartment idept = null;
switch (db)
{
case "Sqlserver":
idept = new SqlServerDepartment();
break;
case "Access":
idept = new AccessDepartment();
break;
}
return idept;
}
}
}

简单工厂模式测试类

      //简单工厂与抽象工厂模式相结合
User user = new User();
Department dept = new Department();
IUser iuser = SelectDB.CreateUser();
iuser.Insert(user);
iuser.GetUser("ID");
IDepartment idept = SelectDB.CreateDept();
idept.Insert(dept);
idept.GetDept("name");

若增加Oracle数据库,则需要更改Switch语句块 违背开放-封闭原则。解决此问题的方法是采用反射

将SelectDB换成反射类(Reflection)

添加反射引用命名空间using System.Reflection;

using System.Reflection;
namespace FactoryMethodPatternDB
{
class Reflection
{
private static readonly string AssemblyName = "FactoryMethodPatternDB"; //程序集
private static readonly string db = "SqlServer"; //业务类的名称为SqlServer + 表名 如(SqlServerUser)方便反射使用 public static IUser CreateUser()
{
string className = AssemblyName + ".CLASS." + db + "User"; //类名(带命名空间)
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
} public static IDepartment CreateDept()
{
string className = AssemblyName + "." + "Department";
return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
}

反射测试类

   //反射与抽象工厂模式相结合
User user = new User();
Department dept = new Department();
IUser iuser = Reflection.CreateUser();
iuser.Insert(user);
iuser.GetUser("ID"); IDepartment idept = Reflection.CreateDept();
idept.Insert(dept);
idept.GetDept("Name");

C#反射—解决类的实例化问题的更多相关文章

  1. 深入分析Java反射(五)-类实例化和类加载

    前提 其实在前面写过的<深入分析Java反射(一)-核心类库和方法>已经介绍过通过类名或者java.lang.Class实例去实例化一个对象,在<浅析Java中的资源加载>中也 ...

  2. java学习笔记之反射—Class类实例化和对象的反射实例化

    反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,可以采用三种方式完成. java.lang.Class类的定义: public f ...

  3. [改善Java代码]让工具类不可实例化

    建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math.java.util.Collections等都是我们经常用到的.工具类的方法和属性 ...

  4. Java 反射 Class类

    Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...

  5. C#如何通过反射调用类下的方法

    首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...

  6. C# 利用反射调用类下的方法

    namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...

  7. 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题

    通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署  ClassCastException异常 反射 ...

  8. 进阶Java编程(9)反射与类操作

    1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...

  9. CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】

    反射 反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法. hasattr 通过字符串 判断对象的属性或者方法是否存在 getattr 通过字符串  获取对象的属性或者方法        ...

随机推荐

  1. InfiniBand技术简介

    InfiniBand技术简介   转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍         随着CPU和通讯处理速度的 ...

  2. 转:关于PHP性能优化

    原文来自于:http://www.cnblogs.com/qq78292959/archive/2012/12/28/2837272.html 1.升级硬件的一般规则:对于 PHP 脚本而言,主要的瓶 ...

  3. 工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)

    原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中 ...

  4. GNU PID

    多进程编程 写在前面的话 本文主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分总结, 又可成为文章发表. 对UNIX程序员初学者来 说是一个小小的经验, 仅 ...

  5. BZOJ 1032 祖玛

    Description 这是一个流行在Jsoi的游戏,名称为祖玛.精致细腻的背景,外加神秘的印加音乐衬托,彷佛置身在古老的国度里面,进行一个神秘的游戏——这就是著名的祖玛游戏.祖玛游戏的主角是一只石青 ...

  6. Why GEMM is at the heart of deep learning

    Why GEMM is at the heart of deep learning I spend most of my time worrying about how to make deep le ...

  7. int 和String之间的互转

    int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...

  8. QMapControl介绍

    QMapControl是Qt开发的基于LGPL协议开源的显示OpenStreetMap(下简称osm)Tile数据和基于wms-server服务的数据,这里做简单介绍并列出相关资源. QMapCont ...

  9. 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果

    原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...

  10. java数组学习

    1. java数组的静态特性:          java是静态语言,java中数组的长度是固定的.还有,数组元素的类型也是在定义时指定了的. 2. java数组里的关键词:          数组变 ...