C#抽象工厂简单实现类

曾经参与开发过的的项目,一般都是采用MVC模式进行开发,大概框架图如下:

web界面层调用BLL业务层,BLL通过抽象工厂DALFactory动态生成继承了IDAL的数据库操作层实例,以进行对数据库的各项操作。

DALFactory这层主要是根据web配置,通过反射动态生成IDAL实例,方便BLL层调用。

以前的做法是,IDAL每增加一个接口(如IUser),DALFactory就得添加一个方法用于产生继承了该接口的实例类.粗略代码:

public class DataAccess
{

protected static readonly string path = ConfigurationManager.AppSettings["ReportDemo_DAL"];

public static IExcel_ReportCell CreateExcel_ReportCell()
{
string className = path + "." + typeof(IExcel_ReportCell).Name.Substring(1);
return (IExcel_ReportCell)Assembly.Load(path).CreateInstance(className);
}

public static IExcel_Reportcondition CreateExcel_Reportcondition()
{
string className = path + "." + typeof(IExcel_Reportcondition).Name.Substring(1);
return (IExcel_Reportcondition)Assembly.Load(path).CreateInstance(className);
}
//更多....

}

这样就会有一个问题A:每添加一个接口就得创建一个工厂方法。感觉太麻烦了,于是对这个工厂进行了修改,代码如下:

1 using System.Reflection;
2  using System.Web;
3  using System.Web.Caching;
4  using System.Configuration;
5
6  namespace EHRExcelReprot.DALFactory
7 {
8 public sealed class ObjDataAccess<T>
9 {
10 //获取web.confg文件配置信息
11   private static readonly string path = ConfigurationManager.AppSettings["ExcelReportDAL"];
12 public static T Get()
13 {
14 //注意:这里一定要确保这样一个命名规则:接口类名称只比继承它的类名称前面多一个‘I’字母
15 //如:接口类名:IUser,继承它的类:User
16   string CacheKey = path + "." + typeof(T).Name.Substring(1);
17 object objType = DataCache.GetCache(CacheKey);//从缓存读取
18   if (objType == null)
19 {
20 try
21 {
22 objType = Assembly.Load(path).CreateInstance(CacheKey);//反射创建
23 DataCache.SetCache(CacheKey, objType);// 写入缓存
24 }
25 catch
26 { }
27 }
28 return (T)objType;
29 }
30 }
31 /// <summary>
32 /// 缓存操作类
33 /// </summary>
34 public class DataCache
35 {
36 public static object GetCache(string CacheKey)
37 {
38 Cache objCache = HttpRuntime.Cache;
39 return objCache[CacheKey];
40 }
41
42 public static void SetCache(string CacheKey, object objObject)
43 {
44 Cache objCache = HttpRuntime.Cache;
45 objCache.Insert(CacheKey, objObject);
46 }
47 }
48 }

BLL层调用代码:

private static readonly IExcel_ReportInfo dal = ObjDataAccess<IExcel_ReportInfo>.Get();

这样就解决了上面的问题A。

本人菜鸟级别,希望得到各位大师的指点,谢谢。

时间: 2024-10-27 05:43:46

C#抽象工厂简单实现类的相关文章

简单工厂、工厂方法、抽象工厂之小结、区别

很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一系列方法)去生产产品(一个或一系列类的实例). 另外,有时候,我们常常会将生产产品的一个或一系列方法封装到一个类中,我习惯把这个类叫做“工厂类”:而被实例化的类称作“产品类”. 2 简单工厂 工厂类(SimpleFactory)拥有一个工厂方法(create),接受了一个参数,通过不同的参数实例化不

设计模式 简单工厂+工厂方法+抽象工厂

简单工厂 简单工厂的优缺点: 缺点:①违反了OCP(开放-封闭原则).(当工厂内增加一个方法创建对象时候,需要在原来的工厂内,添加一个case语句).修改原来的类,是违反设计原则的. ②增加客户端和工厂类的耦合. 优点:①去除(非降低)客户端和具体产品的耦合.客户端和具体产品中间增加一个工厂类,增加客户端和工厂类的耦合. ②封装工厂类,实现代码多平台的复用性.创建对象的过程被封装成工厂类,可以多平台(控制台+WEB+Winform...手机端)调用这个工厂. ③封装工厂类,创建对象的过程(具体逻

C#设计模式——抽象工厂模式

一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍

工厂方法模式And抽象工厂模式

一.工厂方法模式 简单工厂模式的缺陷就是类的创建太过于依赖工厂,一旦需要进行程序扩展,就必须修改工厂类的代码 这违背了背包原则. 而工厂方法模式针对这一问题进行了改进. public interface Sender { public void send(); } public interface producer { public Sender produce(); } public class MailFactory implements producer{ public Sender pr

C#设计模式——抽象工厂模式(原文转自:http://blog.jobbole.com/78059/)

一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

(五) 抽象工厂模式

转载:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 前两章我们已经讨论了两种有关工厂的模式,今天我们来看最后一种与工厂相关的模式,抽象工厂模式. 抽象工厂模式算是工厂相关模式的终极形态,如果各位完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好理解了.它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品.这其实是工厂方法模式的一种扩展不是吗? 通常意义来我

面向对象设计——抽象工厂(Abstract Factory)模式

定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产品中被解耦. 适用场景 在以下情况可以使用Abstract Factory模式 一个系统要独立于它的产品的创建.组合和表示时 一个系统要由多个产品系列中的一个来配置时 当你要强调一系列相关的产品对象的设计以便进行联合使用时 当你提供一个产品类库,而只想显示它们的接口而不是实现时 UML图 抽象工厂模

设计模式(六)抽象工厂模式

一.应用背景 还是以宝马汽车制造为例. 随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件.于是这个工厂开始生产空调和发动机,用来组装汽车.这时候工厂有两个系列的产品:空调和发动机.宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机. 二.具体例子: 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.比如宝马320系列使用空调型号A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为32