抽象工厂模式, 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定他们具体的类.
反射格式:
Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
using System.Reflection;
IUser result = (IUser)Assembly.Load("抽象工厂模式").CreateInstance("抽象工厂模式".AccessUser);
之前选择产品类型的工厂是通过在编译前就决定的, 而反射通过字符串来实例化对象, 可以用变量来处理, 根据需要更换.
using System.Reflection;
class DataAccess {
private static readonly string AssemblyName = "抽象工厂模式";
private static readonly string db = "Sqlserver";
public static IUser CreateUser() {
string className = AssemblyName + "." + db + "User";
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public static IDepartment CreateDepartment() {
string className = AssemblyName + "." + db + "Department";
return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
但是在更换数据库访问时, 我们还是需要去改程序(更改db这个字符串的值)重编译, 不符合开放-封闭原则.
利用配置文件给DB字符串赋值.
<?xml version = "1.0" encoding = "utf=8" ?>
<configuration>
<appSettings>
<add key = "DB" value = "Sqlserver"/>
</appSettings>
</configuration>
所有在用简单工厂的地方, 都可以考虑用反射技术来去除switch或if, 解除分支判断带来的耦合.