设计模式<2>------工厂模式和抽象工厂模式------创建型
简单工厂:

拿我们的简单三层举例子
先定义dal层
class Dal
{
public void Delete()
{
}
}
工厂类
class Factory
{
//这样掉的好处是 当dal层发生变化的时候不需要去每个调用的地方修改对应的实例,只需要在工厂里面修改对应的实例就行。
//例如Dal的名字换成DAL 这个时候只需要改动工厂里面对应的实例名称即可。
public static Dal CreateInstance()
{
return new Dal();
}
}
在BLL层中实例化Dal层对象
class Bll
{
Dal dal = Factory.CreateInstance();
}
这样的好处是当dal层名称发生变化时,只需要改动一处即可,调用者无需关系调用的对象!
优点:可以提高程序的扩展性,减少修改量!
抽象工厂(一般配合反射或者配置文件来用):

场景我们的系统要同时支持两个数据库 SqlServer 跟Oracle数据库 并且不同的环境要进行随时切换。
看下面的代码:
interface ISqlServer
{
//数据库添加操作
public void Add();
} interface IOracle
{
//数据库添加操作
public void Add(); } class SqlServer : ISqlServer
{
public void Add()
{
Console.WriteLine("SqlServer添加操作");
}
} class Oracle : IOracle
{
public void Add()
{
Console.WriteLine("Oracle添加操作");
}
} class SqlServerFactory : AbstractFactory
{
public ISqlServer GetSqlServer()
{
return new SqlServer();
} } class OracleFactory : AbstractFactory
{ public IOracle GetOracle()
{
return new Oracle();
}
} interface AbstractFactory
{
public ISqlServer GetSqlServer();
public IOracle GetOracle(); } static void Main(string[] args)
{
//调用的场景
AbstractFactory sqlServer = new SqlServerFactory();
sqlServer.GetSqlServer().Add();
AbstractFactory oracleServer = new OracleFactory();
sqlServer.GetOracle().Add(); }
这样调用还是觉得有点麻烦,我们可以用反射来实例化对象。 我们在来完善一下AbstractFactory。
public abstract AbstractFactory
{
public static AbstractFactory GetInstance()
{
string factoryName = System.Configuration.ConfigurationManager.AppSettings["factoryName"]; AbstractFactory instance; if (factoryName != "")
instance = (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
else
instance = null; return instance;
}
public abstract ISqlServer GetSqlServer();
public abstract IOracle GetOracle(); } //调用
static void Main(string[] args)
{ AbstractFactory.GetInstance().GetOracle().Add();
AbstractFactory.GetInstance().GetSqlServer().Add();
} //配置config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="factoryName" value="SqlServerFactory"></add>
</appSettings>
</configuration>
设计模式<2>------工厂模式和抽象工厂模式------创建型的更多相关文章
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
随机推荐
- EtherCAT主站对PHY有要求?
/********************************************************************** * EtherCAT主站对PHY有要求? * 说明: * ...
- latex如何定义宏,插图统一尺寸减少工作量
问题背景是这样的,因为我要在文中插入一系列的图片,但是这些图片的大小我要保持一致,来达到预期的效果. 比如我有三个figure,这三个figure中,每个figure里面有两行,5列图片,我想要的是, ...
- Java中对Array数组的常用操作
目录: 声明数组: 初始化数组: 查看数组长度: 遍历数组: int数组转成string数组: 从array中创建arraylist: 数组中是否包含某一个值: 将数组转成set集合: 将数组转成li ...
- 博客作业06--结构体&指针
1.本章学习总结 1.1思维导图 1.2.本章学习体会 结构体突破了数组的局限,把不同类型有内在联系的数据汇聚成一个整体,这种新的构造数据类型,提供了更便利的手段,更好的实现代码功能.通过代码建立文件 ...
- 前端导出csv
前端导出csv export: function(data, name) { // csv文件的BOM头 \ufeff可以让excel等识别出csv文件的编码 var uri = 'data:text ...
- 作业一 :关于C语言
C语言是计算机专业的基础课,同时也是计算机专业的第一个入门语言,学好C语言母庸质疑.就目前来看,在C语言中已经学习的内容有:基本运算符及表达式.输入输出函数.选择 结构程序设计.循环结构程序设计.数组 ...
- 移动端单位rem计算
!(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...
- Java design patterna
Java中的设计模式 设计模式是解决特定问题/任务的充分证明的解决方案. 现在,一个问题会在你脑海中产生什么样的具体问题?让我举个例子来解释一下. 给出的问题:假设您要创建一个只应创建单个实例(或对象 ...
- js处理数字加后缀w
num > 9999 ? (Math.floor(num/1000)/10) + 'w' : num
- 使用DHCP动态管理主机地址