.NET抽象工厂模式微理解--教你在项目中实现抽象工厂
.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类,属性(自动属性)如下:
public class PeopleModel
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool Sex { get; set; }
}
在IAXCDAL层里面新建一个IPeopleDAL类,该类里面的内容是AXCDAL数据访问层里面的接口方法,如下:
public interface IPeopleDAL
{
List<AXCModel.PeopleModel> getPeopleList();
}
在AXCDAL层里面新建一个PeopleDAL类,继承IPeopleDAL类,该类里面的内容是IAXCDAL层里的具体的方法的实现,如下(由于没有设计数据库,暂时手动代替一下):
public class PeopleDAL:IAXCDAL.IPeopleDAL
{ public List<AXCModel.PeopleModel> getPeopleList()
{
List<AXCModel.PeopleModel> People = new List<AXCModel.PeopleModel>(){
new AXCModel.PeopleModel(){ Id=1,Name="艾新草",Age=25,Sex=false},
new AXCModel.PeopleModel(){ Id=2,Name="艾新草1",Age=23,Sex=true},
new AXCModel.PeopleModel(){ Id=3,Name="艾新草2",Age=22,Sex=false}
};
return People;
}
}
在AXCFactoryDAL层里新建一个抽象类:AbsFactoryDAL,该类实现了读取配置文件中的配置的数据访问层,方便实现支持多数据库开发,如下,
public abstract class AbsFactoryDAL
{
/// <summary>
/// 根据配置文件 获取 实体数据工厂 对象
/// </summary>
/// <returns></returns>
public static AbsFactoryDAL GetFatory()
{
string strType = System.Configuration.ConfigurationManager.AppSettings["dalType"].ToString();
AbsFactoryDAL dalFactory = null;
switch (strType)
{
case "dal":
dalFactory = new DALFatory();
break; }
return dalFactory;
}
public abstract IAXCDAL.IPeopleDAL GetPeople();
}
在新建一个DALFatory类,该类继承了AbsFactoryDAL,返回一个具体的数据访问层实例,如下:
public class DALFatory : AbsFactoryDAL
{ public override IAXCDAL.IPeopleDAL GetPeople()
{
return new AXCDAL.PeopleDAL();
}
}
在IAXCBLL层里面新建一个IPeopleBLL类,该类里面的内容是AXCBLL业务逻辑层里面的接口方法,如下:
public interface IPeopleBLL
{
List<AXCModel.PeopleModel> getPeopleList();
}
在AXCBLL层里面新建一个PeopleBLL类,继承IPeopleBLL类,该类里面的内容是IAXCBLL层里的具体的方法的业务实现,如下:
public class PeopleBLL:IAXCBLL.IPeopleBLL
{
// IAXCDAL.IPeopleDAL IPeopleDal =null;
/// <summary>
/// 数据抽象工厂 - 由抽象工厂类的 静态方法创建 : 父类 obj = new 子类();
/// </summary>
AXCFactoryDAL.AbsFactoryDAL absFactoryDAL = AXCFactoryDAL.AbsFactoryDAL.GetFatory(); public List<AXCModel.PeopleModel> getPeopleList()
{
IAXCDAL.IPeopleDAL IPeopleDal = absFactoryDAL.GetPeople();
return IPeopleDal.getPeopleList();
}
}
与在AXCFactoryDAL层里新建工厂差不多,在AXCFactory层里新建一个抽象类:AbsFactoryBLL,该类实现了读取配置文件中的配置的业务逻辑层,方便实现支持多数据库开发多个业务逻辑层,如下,
/// <summary>
/// 根据配置文件 获取 实体业务工厂 对象
/// </summary>
/// <returns></returns>
public static AbsFactoryBLL GetFatory()
{
string strType = System.Configuration.ConfigurationManager.AppSettings["bllType"].ToString();
AbsFactoryBLL bllFactory = null;
switch (strType)
{
case "bll":
bllFactory = new BLLFatory();
break; }
return bllFactory;
} public abstract IAXCBLL.IPeopleBLL GetPeople();
}
在新建一个BLLFatory类,该类继承了AbsFactoryBLL,返回一个具体的业务逻辑层实例,如下:
public class BLLFatory :AbsFactoryBLL
{
public override IAXCBLL.IPeopleBLL GetPeople()
{
return new AXCBLL.PeopleBLL();
}
}
好了,基础的工作我们已经完成的差不多了,现在就在web层里配置一下webconfig文件,如下:
<appSettings>
<add key="bllType" value="bll"/>
<add key="dalType" value="dal"/>
</appSettings>
调用一下我们所写的方法,方法如下:
最好的效果图如下:

好了,以上就是本人对于抽象工厂模式的微理解。希望你看完本文也对抽象模式有一个微理解。
.NET抽象工厂模式微理解--教你在项目中实现抽象工厂的更多相关文章
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- js对于工厂模式的理解
有很多人对工厂模式有着这样或者那样不理解的地方,今天我就和大家分享一下我的心得. 其实工厂模式是基于面向对象的一种模式.大家先看这样的一段代码: 其实这个程序很简单,学过js的人都会写,基本没什么问题 ...
- Java工厂模式浅析理解
由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...
- .NET重构(一):抽象工厂模式实现登录
导读:一路艰辛,我也走到了重构.在重构之前,师傅让用经典三层(UI.BLL.DAL)敲了登录.用户的增删改查,共五条线.从开始对三层的朦胧,到五条线结束,终于对三层有了逻辑上清晰的理解.然后就画了几天 ...
- php设计模式总结-工厂模式
使用工厂模式的目的或目标? 工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象.减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码. 通俗的说,以前创建 ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
- 深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
随机推荐
- Powershell ForEach-Object 循环
Powershell管道就像流水线,对于数据的处理是一个环节接着一个环节,如果你想在某一环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_ 代表当前的数据. 对管道对象逐个 ...
- Powershell 条件操作符
Powershell 中的比较运算符-eq :等于-ne :不等于-gt :大于-ge :大于等于-lt :小于-le :小于等于-contains :包含-notcontains :不包含 进行比较 ...
- 【转】android service 之二(IntentService)
原文网址:http://rainbow702.iteye.com/blog/1143286 不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的.所以,如果你的Service ...
- Jquery回车键切换焦点方法(兼容各大浏览器)
做项目时,客户要求能够用enter回车直接切换输入(焦点),当最后一个时候,直接提交信息. 第一想法就是,网上去copy一段代码直接用.但了百度.谷歌找了个遍,找到的代码80%以上都是一样的.有的代码 ...
- 法爱格2014 春夏新款欧美纯色修身高腰无袖吊带V领 拼接性感 连衣裙 黑色 M【图片 价格 品牌 报价】-京东
法爱格2014 春夏新款欧美纯色修身高腰无袖吊带V领 拼接性感 连衣裙 黑色 M[图片 价格 品牌 报价]-京东 法爱格2014 春夏新款欧美纯色修身高腰无袖吊带V领 拼接性感 连衣裙 黑色 M
- c语言函数定义、函数声明、函数调用以及extern跨文件的变量引用
1.如果没有定义,只有声明和调用:编译时会报连接错误.undefined reference to `func_in_a'2.如果没有声明,只有定义和调用:编译时一般会报警告,极少数情况下不会报警告. ...
- json对象与字符串的相互转换,数组和字符串的转换
1.json对象转换为字符串 JSON.stringify(value [, replacer] [, space]) var student = new Object(); student.id ...
- Hadoop动态加入/删除节点(datanode和tacktracker)
大体,正确的做法是首选的配置文件,然后开始详细机对应的进程/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说加入/删除DataNode和TaskTracke ...
- UVALive 4043 Ants
KM 构图求最小权值匹配 保证最小的权值,所连的边一定是能够不相交的. Ants Time Limit: 3000MS Memory Limit: Unknown 64bit IO For ...
- Android Fragment详解(四):管理Fragment
要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...