.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)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
随机推荐
- ServletConfig对象 【通过此对象获取到web.xml中的信息】
用途: 1)想让当前的Servlet读取一些在web.xml文件配置的初始化参数时, 可以使用ServletConfig对象,他是Servlet运 ...
- Touch事件
http://www.cnblogs.com/shawn-xie/archive/2012/12/07/2805582.html 前言 一个触屏网站到底和传统的pc端网站有什么区别呢,交互方式的改变首 ...
- codeforces Ilya and Matrix
http://codeforces.com/contest/313/problem/C #include <cstdio> #include <cstring> #includ ...
- linux sar查看网络流量
sar -n DEV 1 10 -n { keyword [,...] | ALL } Report network statistics. IFACE Name of the network int ...
- ASP.NET MVC4中的Model验证 移除指定验证信息
MVC中通过Model在页面间传值使的程序开发变得更加的快捷,但是很多时候,我们在数据传递的时候为了确保数据的有效性,要对Model的相关属性做基本的数据验证. 不多说直接上个代码,Model的实体类 ...
- MVC4.0系统开发新手历程(三)---数据导入计算
数据导入计算 数据的重要意义就不需要我多说了吧,本项目中的数据来源是来自荆艺系统(熟悉物流报关的朋友应该知道)导出的一张Excel,包含了一段时间内整个公司所有销售的全部记录,保密级别那是杠杠的, ...
- poj1006 ( hdu1370 ):中国剩余定理裸题
裸题,没什么好说的 第一个中国剩余定理 写暴力都过了..可见这题有多水 代码: #include<iostream> #include<stdio.h> #include< ...
- 探讨socket引发SIGPIPE信号的问题
我写socket相关的程序也不是一天两天了,在我的记忆中,只要处理好recv(或read)的返回值中<0,==0,>0三种情况,程序便不会有什么问题.但最近在看公司的源代码时,发现代码中直 ...
- python3-day6(模块)
一.OS模块 1.os.system('ls -l') #子shell运行,获取返回值,不是结果. 2.os.popen('ls -l').read() #获取结果. 二.sys模块 1.sys.ar ...
- Hive MapJoin
摘要 MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能 ...