.NET抽象工厂模式微理解--教你在项目中实现抽象工厂

  最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的同事和博友们理解。不足之处,还请斧正!

  首先简单阐述一些三层的关系,相信观看该文章的博友们对于三层设计早已经是烂熟于心了,我这边就简单说明一下:
用户界面表示层(Web)
业务逻辑层(BLL)
数据访问层(DAL)
    1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.
    2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。
    3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx, 如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
  下面阐述一些抽象工厂模式的作用,请看图(该图为我一个老师所画,在这里给大家简单看一下) 

OK,言归正传,我们来跟着项目做一个抽象工厂模式的demo
下面新建一个解决方案:如下图:

他们之间的描述及引用关系如下:
AXCModel层:实体类层
AXCDAL层:数据访问层
IAXCDAL层:数据访问层接口
AXCFactoryDAL层:数据访问工厂设计
AXCBLL层:业务逻辑层
IAXCBLL层:业务逻辑层接口
AXCFactory层:业务逻辑层工厂设计
AXCWeb层:表现层
接口之间的引用关系如下:
IAXCDAL层和IAXCBLL层引用AXCModel层
AXCDAL层引用IAXCDAL层和AXCModel层
AXCBLL层引用AXCFactoryDAL层和IAXCBLL层和IAXCDAL层和AXCModel层
工厂之间的引用:
AXCFactoryDAL层引用AXCDAL层和IAXCDAL层
AXCFactory层引用AXCBLL层和IAXCBLL层
表现层引用:
AXCWeb层引用AXCFactory层和IAXCBLL层和AXCModel层

  下面我们就以一个简单的获取记录条数为功能实现抽象工厂模式:
在AXCModel层里面新建一个PeopleModel类,属性(自动属性)如下:

  1. public class PeopleModel
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public int Age { get; set; }
  6. public bool Sex { get; set; }
  7. }

在IAXCDAL层里面新建一个IPeopleDAL类,该类里面的内容是AXCDAL数据访问层里面的接口方法,如下:

  1. public interface IPeopleDAL
  2. {
  3. List<AXCModel.PeopleModel> getPeopleList();
  4. }

在AXCDAL层里面新建一个PeopleDAL类,继承IPeopleDAL类,该类里面的内容是IAXCDAL层里的具体的方法的实现,如下(由于没有设计数据库,暂时手动代替一下):

  1. public class PeopleDAL:IAXCDAL.IPeopleDAL
  2. {
  3.  
  4. public List<AXCModel.PeopleModel> getPeopleList()
  5. {
  6. List<AXCModel.PeopleModel> People = new List<AXCModel.PeopleModel>(){
  7. new AXCModel.PeopleModel(){ Id=1,Name="艾新草",Age=25,Sex=false},
  8. new AXCModel.PeopleModel(){ Id=2,Name="艾新草1",Age=23,Sex=true},
  9. new AXCModel.PeopleModel(){ Id=3,Name="艾新草2",Age=22,Sex=false}
  10. };
  11. return People;
  12. }
  13. }

在AXCFactoryDAL层里新建一个抽象类:AbsFactoryDAL,该类实现了读取配置文件中的配置的数据访问层,方便实现支持多数据库开发,如下,

  1. public abstract class AbsFactoryDAL
  2. {
  3. /// <summary>
  4. /// 根据配置文件 获取 实体数据工厂 对象
  5. /// </summary>
  6. /// <returns></returns>
  7. public static AbsFactoryDAL GetFatory()
  8. {
  9. string strType = System.Configuration.ConfigurationManager.AppSettings["dalType"].ToString();
  10. AbsFactoryDAL dalFactory = null;
  11. switch (strType)
  12. {
  13. case "dal":
  14. dalFactory = new DALFatory();
  15. break;
  16.  
  17. }
  18. return dalFactory;
  19. }
  20. public abstract IAXCDAL.IPeopleDAL GetPeople();
  21. }

在新建一个DALFatory类,该类继承了AbsFactoryDAL,返回一个具体的数据访问层实例,如下:

  1. public class DALFatory : AbsFactoryDAL
  2. {
  3.  
  4. public override IAXCDAL.IPeopleDAL GetPeople()
  5. {
  6. return new AXCDAL.PeopleDAL();
  7. }
  8. }

在IAXCBLL层里面新建一个IPeopleBLL类,该类里面的内容是AXCBLL业务逻辑层里面的接口方法,如下:

  1. public interface IPeopleBLL
  2. {
  3. List<AXCModel.PeopleModel> getPeopleList();
  4. }

在AXCBLL层里面新建一个PeopleBLL类,继承IPeopleBLL类,该类里面的内容是IAXCBLL层里的具体的方法的业务实现,如下:

  1. public class PeopleBLL:IAXCBLL.IPeopleBLL
  2. {
  3. // IAXCDAL.IPeopleDAL IPeopleDal =null;
  4. /// <summary>
  5. /// 数据抽象工厂 - 由抽象工厂类的 静态方法创建 : 父类 obj = new 子类();
  6. /// </summary>
  7. AXCFactoryDAL.AbsFactoryDAL absFactoryDAL = AXCFactoryDAL.AbsFactoryDAL.GetFatory();
  8.  
  9. public List<AXCModel.PeopleModel> getPeopleList()
  10. {
  11. IAXCDAL.IPeopleDAL IPeopleDal = absFactoryDAL.GetPeople();
  12. return IPeopleDal.getPeopleList();
  13. }
  14. }

与在AXCFactoryDAL层里新建工厂差不多,在AXCFactory层里新建一个抽象类:AbsFactoryBLL,该类实现了读取配置文件中的配置的业务逻辑层,方便实现支持多数据库开发多个业务逻辑层,如下,

  1. /// <summary>
  2. /// 根据配置文件 获取 实体业务工厂 对象
  3. /// </summary>
  4. /// <returns></returns>
  5. public static AbsFactoryBLL GetFatory()
  6. {
  7. string strType = System.Configuration.ConfigurationManager.AppSettings["bllType"].ToString();
  8. AbsFactoryBLL bllFactory = null;
  9. switch (strType)
  10. {
  11. case "bll":
  12. bllFactory = new BLLFatory();
  13. break;
  14.  
  15. }
  16. return bllFactory;
  17. }
  18.  
  19. public abstract IAXCBLL.IPeopleBLL GetPeople();
  20. }

在新建一个BLLFatory类,该类继承了AbsFactoryBLL,返回一个具体的业务逻辑层实例,如下:

  1. public class BLLFatory :AbsFactoryBLL
  2. {
  3. public override IAXCBLL.IPeopleBLL GetPeople()
  4. {
  5. return new AXCBLL.PeopleBLL();
  6. }
  7. }

好了,基础的工作我们已经完成的差不多了,现在就在web层里配置一下webconfig文件,如下:

  1. <appSettings>
  2. <add key="bllType" value="bll"/>
  3. <add key="dalType" value="dal"/>
  4. </appSettings>

调用一下我们所写的方法,方法如下:
最好的效果图如下:

好了,以上就是本人对于抽象工厂模式的微理解。希望你看完本文也对抽象模式有一个微理解。

.NET抽象工厂模式微理解--教你在项目中实现抽象工厂的更多相关文章

  1. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  2. SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  3. js对于工厂模式的理解

    有很多人对工厂模式有着这样或者那样不理解的地方,今天我就和大家分享一下我的心得. 其实工厂模式是基于面向对象的一种模式.大家先看这样的一段代码: 其实这个程序很简单,学过js的人都会写,基本没什么问题 ...

  4. Java工厂模式浅析理解

    由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...

  5. .NET重构(一):抽象工厂模式实现登录

    导读:一路艰辛,我也走到了重构.在重构之前,师傅让用经典三层(UI.BLL.DAL)敲了登录.用户的增删改查,共五条线.从开始对三层的朦胧,到五条线结束,终于对三层有了逻辑上清晰的理解.然后就画了几天 ...

  6. php设计模式总结-工厂模式

    使用工厂模式的目的或目标? 工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象.减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码. 通俗的说,以前创建 ...

  7. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  8. 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式

    1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...

  9. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

随机推荐

  1. Delphi 函数指针(函数可以当参数)

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  2. 【转】深入理解Android的startservice和bindservice--不错

    原文网址:http://www.cnblogs.com/yejiurui/p/3429451.html 一.首先,让我们确认下什么是service?         service就是android系 ...

  3. 使用kthread内核线程的内核模块

    这里使用了msleep(50); printk 开启其实挺大的,当我使用msleep(10);机器直接卡死了: 另外ISERR不能判断结构体的,只能判断 空指针 #cat hello.c #inclu ...

  4. jsonp+handler 的实现

    //参考 http://www.cnblogs.com/yuwensong/archive/2013/05/28/3103064.html 后台: public void ProcessRequest ...

  5. json对象与字符串的相互转换,数组和字符串的转换

    1.json对象转换为字符串 JSON.stringify(value [, replacer] [, space])  var student = new Object(); student.id ...

  6. User Defined Runtime Attributes

    设置View borderWidth/cornerRadius/borderColor 为了兼容CALayer 的KVC ,你得给CALayer增加一个分类 CALayer+BorderColor.h ...

  7. linux core dump学习

    1. core dump是什么? core dump又叫核心转储,当操作系统收到特定的signal时, 会生成某个进程的core dump文件.这样程序员可以根据 已经生成的core dump文件来d ...

  8. [Cycle.js] Customizing effects from the main function

    How can we show one string on the DOM, and a completely different string on Console log? This lesson ...

  9. C/C++笔试准备(2)

    问题:编辑距离,是指将一个字符串变为另一个字符串,仅可以3种操作:修改一个字符,删除一个字符,插入一个字符.the变成that:删除e,插入a,插入t.20’ 实现编辑距离算法. 解算:利用动态规划的 ...

  10. MyEclipse 安装activiti designer

    下载activiti designer 文件地址:http://activiti.org/designer/archived/ 注意:我的是myeclipse9.0,我下载的版本是:(当我下载高版本安 ...