抽象工厂模式
1)抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。
2)以不同数据库中的两种表为例
3)适用性
在以下情况下可以试用AbstractFactory模式
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要多个产品系列中的一个来配置。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现。
4)抽象工厂模式的优缺点
优点:
- 具体产品从客户端代码中分离出来,
- 容易改变产品的系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易.
- 将一个系列的产品族统一到一起创建。
缺点:
产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。(如果增加项目表Project,就需要增加三个类,Iproject、SqlserverProject、AcessProject,还需要改Ifactory、SqlserverFactory和AcessFactory才可以完全实现。要改三个类,这就太糟糕了。)
5)用简单工厂来改进抽象工厂
代码:
classDataAccess
{
private static readonly string db ="Sqlserver";
public static IUser CreateUser()
{
IUser result = null;
switch (db)
{
case "Sqlserver":
result =new SqlserverUser();
break;
case "Access":
result = new AccessUser();
break;
}
return result;
}
public static IDepartmentCreateDepartment()
{
IDepartment result = null;
switch(db)
{
case "Sqlserver":
result=newSqlserverDepartment ();
break;
case "Access":
result =new AccessDepartment ();
break;
}
return result;
}
}
static void Main(string[] args)
{
User user = new User();
Department dept = new Department();
IUser iu = DataAccess.CreateUser();
iu.Insert(user);
iu.GetUser(1);
IDepartment id =DataAccess.CreateDepartment();
id.Insert (dept);
id.GetDepartment(1);
Console.Read();
}
6)用反射+抽象工厂的数据访问程序(根据字符串去哪个地方应该要实例化那一个类,这样可以去掉Case语句)
classDataAccess
{
private static readonly stringAssemblyName = "抽象工厂五";
private static readonly string db ="Sqlserver";
public static IUser CreateUser()
{
string className = AssemblyName +"." + db + "User";
return(IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public static IDepartmentCreateDepartment()
{
string className = AssemblyName +"." + db + "Departemnt";
return(IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
6)用反射+配置文件实现数据访问程序(来解决更改数据库的问题。)
配置文件:
<?xmlversion="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntimeversion="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings >
<add key ="DB" value="Sqlserver"/>
</appSettings>
</configuration>
在开头添加 using System.configuration,有时候还是提示错误,这就需要添加引用+程序集中找到system.configuration勾选上即可
在代码中添加配置文件(改DB赋值即可):
privatestatic readonly string db = ConfigurationManager.AppSettings["DB"];