C#反射—解决类的实例化问题
利用简单工厂模式来改进抽象工厂使用的复杂性(抽象工厂详见 设计模式之—抽象工厂模式)
数据表(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#反射—解决类的实例化问题的更多相关文章
- 深入分析Java反射(五)-类实例化和类加载
前提 其实在前面写过的<深入分析Java反射(一)-核心类库和方法>已经介绍过通过类名或者java.lang.Class实例去实例化一个对象,在<浅析Java中的资源加载>中也 ...
- java学习笔记之反射—Class类实例化和对象的反射实例化
反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,可以采用三种方式完成. java.lang.Class类的定义: public f ...
- [改善Java代码]让工具类不可实例化
建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math.java.util.Collections等都是我们经常用到的.工具类的方法和属性 ...
- Java 反射 Class类
Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...
- 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题
通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署 ClassCastException异常 反射 ...
- 进阶Java编程(9)反射与类操作
1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...
- CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】
反射 反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法. hasattr 通过字符串 判断对象的属性或者方法是否存在 getattr 通过字符串 获取对象的属性或者方法 ...
随机推荐
- 让LINQ中的查询语法使用自定义的查询方法
使用LINQ时有两种查询语法:查询语法和方法语法 查询语法:一种类似 SQL 语法的查询方式 方法语法:通过扩展方法和Lambda表达式来创建查询 例如: List<, , , }; //查询语 ...
- 物联网操作系统 - Contiki
What is Contiki? Contiki is an open source operating system for the Internet of Things. Contiki conn ...
- linux ssh 无密码登陆
要点:有时候ssh localhost 无法登陆本机,但各种设置都正确.重启下就好了...... 参考地址:http://bbs.csdn.net/topics/370109654 三台机器实现互相之 ...
- SKYLINE
uvalive4108:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...
- IBM Websphere 说明文档
http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.nd.doc%2Finfo%2F ...
- ♫【异步】短小强悍的JavaScript异步调用库
短小强悍的JavaScript异步调用库 var queue = function(funcs, scope) { (function next() { if(funcs.length > 0) ...
- Qt入门(15)——使用窗口部件
下面是如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. class MyWidget : public QWidget { public: MyW ...
- 图论(floyd算法):NOI2007 社交网络
[NOI2007] 社交网络 ★★ 输入文件:network1.in 输出文件:network1.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在社交网络( ...
- socket(TCP)发送文件
一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.Componen ...
- Seasar2框架:AOP
Seasar2是由日本人开发的一个框架.它通过自己定义的规约,很大程度上地减少了设定代码.但是由于这个原因,导致了框架学习初期会有比较大的跨越. AOP例子: Greeting.java packag ...