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 通过字符串 获取对象的属性或者方法 ...
随机推荐
- bzoj1662: [Usaco2006 Nov]Round Numbers 圆环数
Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序.她们甚至也不能通过仍硬币的方式. 所以她们通过"round number" ...
- bzoj2215: [Poi2011]Conspiracy
Description Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动.国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是 ...
- jquery如何判断div是否隐藏--useful
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- An Attempt to Understand Boosting Algorithm(s)
An Attempt to Understand Boosting Algorithm(s) WELCOME! Here you will find daily news and tutorials ...
- github上的一些Delphi开源项目
https://github.com/FMXExpress?tab=repositorieshttps://github.com/stars/maurobottahttps://github.com/ ...
- 开启SQL Server 2012的远程连接
有个远程的SQL Server服务器需要连接,因为SQL server默认是把远程连接关闭的. 以下有文档,照着做了,但是还是连不上, http://www.2cto.com/database/201 ...
- Sumdiv(各种数学)
http://poj.org/problem?id=1845 题意:求A^B的所有约数的和再对9901取模: 做了这个学到了N多数学知识: 一:任意一个整数都可以唯一分解成素因子的乘积:A = p1^ ...
- 动态树(Link Cut Tree) :SPOJ 375 Query on a tree
QTREE - Query on a tree #number-theory You are given a tree (an acyclic undirected connected graph) ...
- Delhpi TdxComponentPrinter怎样联上dxdbgrid中的数据打印
有谁知道TdxComponentPrinter怎样联上dxdbgrid中的数据打印? 有谁知道TdxComponentPrinter怎样联上dxdbgrid中的数据打印? 回复人: ...
- 苹果教你六招:设计优秀的icon
在iOS 7测试版发布后,网上开始出现大量关于iOS 7设计的资源.在WWDC期间,苹果曾为开发者举办了多场主题演讲,其中有一场是苹果UX布道师Mike Stern的精彩演讲-- 优秀iOS设计最佳实 ...