反射+抽象工厂的数据访问

如有一接口IUser,继承该接口的两个类分别为SqlserverUser和AccessUser(它们之间的关系是抽象工厂模式)

而到底引用哪个类是通过db变量来决定,if(db=Sqlserver)则实例SqlserverUser反之易然
        
简单模式

View Code
 1 class Data
2 {
3 private static readonly string db = "Sqlserver";//或Access
4 public static IUser CreateUser()
5 {
6 IUser result = null;
7 switch (db)
8 {
9 case "Sqlserver":
10 result = new SqlserverUser();
11 break;
12 case "Access":
13 result = new AccessUser();
14 break;
15 }
16 return result;
17 }
18 }

if再要加一个OracleUser则得加一分支,需修改该类,违反了开放-封闭原则
反射模式

必须引用using System.Reflection;

View Code
 1 class Data
2 {
3 private static readonly string db = "Sqlserver";//或Access
4 private static readonly string AssemblyName = "抽象工厂模式";//当前“程序集”名称
5 public static IUser CreateUser()
6 {
7 string className = AssemblyName + "." + db + "User";//要实例化的“类名”
8 return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
9 }
10 }

第二个抽象工厂模式是指当前“命名空间”名称

IUser result = (IUser)Assembly.Load("抽象工厂模式").CreateInstance("抽象工厂模式.SqlserverUser");

posted @ 2012-02-10 11:31  志誠  阅读(252)  评论(1编辑  收藏  举报