1.App.config文件配置
<configuration>
<appSettings>
<add key="yoyo" value="OperateEmployeesDB"/>
</appSettings>
</configuration>
2.调用
static void Main(string[] args)
{
/*注意此处,和工厂方法一样,当需要使用哪个操作类时,就实例化对应
* 操作类的工厂类。
* 更灵活的方式是将创建 OperateEmployeesFactory() 的具体操作类
* 的命令配置到外部文件中*/
//IAbstractFactory abstractFactory = new OperateEmployeesFactory();
//IOperateDB OperateDB = abstractFactory.CreateIOperateDB();
//工厂方法替换抽象工厂
//string cmd = "OperateEmployeesFactory";
//IOperateDB operateDB = DataAccessFactory.SelectOperateDB(cmd);
//此处调用配置文件,再加上反射,性能虽有损耗,但代码简洁灵活多了
string cmd = ConfigurationManager.AppSettings["yoyo"];
IOperateDB operateDB = DataAccessFactoryEx.CreateOperateDB(cmd);
Console.WriteLine(operateDB.InsertDB());
}
3.工厂类
namespace Data
{
/// <summary>
/// 使用工厂方法替换掉抽象工厂
/// </summary>
public class DataAccessFactory
{
static IOperateDB operateDB;
public static IOperateDB SelectOperateDB(string cmd)
{
switch (cmd)
{
case "OperateEmployeesFactory":
operateDB = new OperateEmployeesDB();
break;
case "OperateCustomersFactory":
operateDB = new OperateCustomersDB();
break;
}
return operateDB;
}
}
/// <summary>
/// 使用反射创建对象实例
/// </summary>
public class DataAccessFactoryEx
{
static IOperateDB operateDB;
public static IOperateDB CreateOperateDB(string cmd)
{
operateDB = (IOperateDB)Assembly.Load("Data").CreateInstance("Data." + cmd);
return operateDB;
}
}
/// <summary>
/// 抽象工厂模式可工厂方法模式的区别在于:抽象工厂中面临多种类型的数据操作类
/// 的创建。但是这样做就引起了各个具体工程类的耦合。
/// </summary>
public interface IAbstractFactory
{
IOperateDB CreateIOperateDB();
IOperateDBEx CreateIOperateDBEx();
}
public class OperateEmployeesFactory : IAbstractFactory
{
#region IAbstractFactory 成员
public IOperateDB CreateIOperateDB()
{
return new OperateEmployeesDB();
}
#endregion
#region IAbstractFactory 成员
public IOperateDBEx CreateIOperateDBEx()
{
return new OperateEmployeesDBEx();
}
#endregion
}
public class OperateCustomersFactory : IAbstractFactory
{
#region IAbstractFactory 成员
public IOperateDB CreateIOperateDB()
{
return new OperateCustomersDB();
}
#endregion
#region IAbstractFactory 成员
public IOperateDBEx CreateIOperateDBEx()
{
return new OperateCustomersDBEx();
}
#endregion
}
}
4.具体工作类
namespace Data
{
/// <summary>
/// 数据操作的功能抽象
/// </summary>
public interface IOperateDB
{
string InsertDB();
string UpdateDB();
string DelDB();
}
/// <summary>
/// 返回列表的操作单独形成一个类
/// </summary>
public interface IOperateDBEx
{
List<string> GetDataList();
}
public class OperateEmployeesDB : IOperateDB
{
public string InsertDB()
{
NorthwindEntities db = new NorthwindEntities();
Employees e = new Employees();
e.LastName = "yoyozhu";
e.FirstName = "zhushao";
db.AddToEmployees(e);
db.SaveChanges();
return "添加数据成功";
}
public string UpdateDB()
{
NorthwindEntities db = new NorthwindEntities();
Employees e = db.Employees.Where(c => c.EmployeeID == 44).FirstOrDefault();
db.DeleteObject(e);
db.SaveChanges();
return "删除数据成功";
}
public string DelDB()
{
NorthwindEntities db = new NorthwindEntities();
Employees e = db.Employees.Where(c => c.EmployeeID == 44).FirstOrDefault();
e.LastName = "chuanshi_yoyo";
db.SaveChanges();
return "修改数据成功";
}
}
public class OperateCustomersDB : IOperateDB
{
public string InsertDB()
{
NorthwindEntities db = new NorthwindEntities();
Customers e = new Customers();
e.ContactName = "yoyozhu";
e.CompanyName = "zhushao";
db.AddToCustomers(e);
db.SaveChanges();
return "添加数据成功";
}
public string UpdateDB()
{
NorthwindEntities db = new NorthwindEntities();
Customers e = db.Customers.Where(c => c.CompanyName == "zhushao").FirstOrDefault();
db.DeleteObject(e);
db.SaveChanges();
return "删除数据成功";
}
public string DelDB()
{
NorthwindEntities db = new NorthwindEntities();
Customers e = db.Customers.Where(c => c.CompanyName == "zhushao").FirstOrDefault();
db.DeleteObject(e);
db.SaveChanges();
return "删除数据成功";
}
}
public class OperateEmployeesDBEx : IOperateDBEx
{
#region IOperateDBEx 成员
public List<string> GetDataList()
{
List<string> list = new List<string>();
NorthwindEntities db = new NorthwindEntities();
var query = from q in db.Employees select q.LastName;
foreach (var str in query)
list.Add(str);
return list;
}
#endregion
}
public class OperateCustomersDBEx : IOperateDBEx
{
#region IOperateDBEx 成员
public List<string> GetDataList()
{
List<string> list = new List<string>();
NorthwindEntities db = new NorthwindEntities();
var query = from q in db.Customers select q.CompanyName;
foreach (var str in query)
list.Add(str);
return list;
}
#endregion
}
}