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

数据表(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. 让LINQ中的查询语法使用自定义的查询方法

    使用LINQ时有两种查询语法:查询语法和方法语法 查询语法:一种类似 SQL 语法的查询方式 方法语法:通过扩展方法和Lambda表达式来创建查询 例如: List<, , , }; //查询语 ...

  2. 物联网操作系统 - Contiki

    What is Contiki? Contiki is an open source operating system for the Internet of Things. Contiki conn ...

  3. linux ssh 无密码登陆

    要点:有时候ssh localhost 无法登陆本机,但各种设置都正确.重启下就好了...... 参考地址:http://bbs.csdn.net/topics/370109654 三台机器实现互相之 ...

  4. SKYLINE

    uvalive4108:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...

  5. IBM Websphere 说明文档

    http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.nd.doc%2Finfo%2F ...

  6. ♫【异步】短小强悍的JavaScript异步调用库

    短小强悍的JavaScript异步调用库 var queue = function(funcs, scope) { (function next() { if(funcs.length > 0) ...

  7. Qt入门(15)——使用窗口部件

    下面是如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. class MyWidget : public QWidget { public: MyW ...

  8. 图论(floyd算法):NOI2007 社交网络

    [NOI2007] 社交网络 ★★   输入文件:network1.in   输出文件:network1.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 在社交网络( ...

  9. socket(TCP)发送文件

    一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.Componen ...

  10. Seasar2框架:AOP

    Seasar2是由日本人开发的一个框架.它通过自己定义的规约,很大程度上地减少了设定代码.但是由于这个原因,导致了框架学习初期会有比较大的跨越. AOP例子: Greeting.java packag ...