就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
梦幻Dot Net
科学地研究编程,品味开发的艺术
博客园
首页
新随笔
联系
订阅
管理
随笔-93 评论-627 文章-7 trackbacks-76
Dot Net设计模式—工厂方法模式
1.引言
工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法经常用于创建与某个类相关的类的实例,.NET中的数据库连接对象就是产生数据命令对象的工厂,其中的CreateCommand方法就是工厂方法,其结构如图所示。
在IDbConnection中定义了产生IdbCommand对象的工厂方法CreateCommand,具体的Command对象由具体的Connection对象创建。它与具体的数据库相关,不同数据库创建不同类型的Command对象。
IdbConnection定义了CreateCommand的接口:
IdbConnectio CreateCommad( );
具体的Connection类中定义了对应的实现,例如针对Oracle数据库:
public OracleCommand CreateCommand( );
2.概述
2.1意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类,这个接口所指的是一个抽象方法。该方法说明需要创建一个对象,但并不给出具体的创建方法和创建什么类型的对象。
C#的代码如下:
Using System;
Namespace CshapeCreator
{
public
abstract
class Cteator
{
public
abstract
Production FactoryMathod();
}
public
class
ConcreteCreator:Creator
{
public
override
Production FactoryMathod()
{
return
new
ConcreteProduction();
}
}
}
2.2使用场合
当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,可以使用工厂方法。
2.3结构
工厂方法的结构如图所示。
需要注意的是,图中表示工厂方法模式的部分只是Factory Method()。在Create中定义这个方法的接口,在ConcreteCreator中实现这个方法。如果没有这个方法,则不是工厂方法模式。还需要说明的是,Creator的职责并非只是创建一个产品,它经常同时还包含模板方法。即模式仅限于方法部分,这也是为什么叫做“工厂方法”的原因。它与抽象工厂和构造器不同,二者都有工厂类。在使用时都需要将工厂类的实例作为参数传递给被使用者,由被使用者做产品的实例化工作,当然这些模式中可能会用到工厂方法模式。
2.4效果
工厂方法使类中的代码不依赖于它必须创建的类,代码只要知道它需要创建的类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。
3..NET中的工厂方法——获得迭代器
.NET中的集合和列表等聚合都提供了对自身进行遍历访问的迭代方法,集合实现Ienumerable接口,而迭代器实现Ienumerator接口。因为迭代器不能脱离聚合独立存在,所以其本身没有公开的构造函数,只能通过聚合创建。不同的聚合采用不同的迭代器,在Ienumerable中定义了产生迭代器的接口,即工厂方法。如图所示。
实现IEnumerable接口的类,如ArrayList等集合类实现了GetEnumerator函数,即实现了工厂方法的具体实现。根据不同的类,获得不同的Ienumerator。例如,ArrayList中的GetEnumerator返回的IEnumerator是ArrayListEnumeratorSimple,Sting中的GetEnumerator 返回的Ienumerator是 CharEnumerator:
using
System;
using
System.Collections;
namespace
Enumerator
{
public
class
Class1
{
[STAThread]
static
void
Main(sting[] args)
{
ArrayList a
=
new
ArrayList();
Ienuemrator e
=
a.GetEnumerator();
System.Console.WriteLine(e.GetType().Name );
String s
=
“ ”;
Ienumerator se
=
s.GetEnumerator();
System.Console.WriteLine(se.GetType().Name );
System.Console.ReadLine ();
}
}
}
在这里,工厂方法起到了连接类层次的作用。
posted on 2005-08-04 15:24
振河
阅读(4055)
评论(4)
编辑
收藏
所属分类:
.Net设计模式
评论:
#1楼
2005-08-05 15:45 |
Ricky [未注册用户]
在2.1中的代码中有一处书写错误:
public abstract slass Cteator
应该是
public abstract class Cteator
回复
引用
#2楼
2005-08-07 15:20 |
振河
更正:
在2.1中的代码中:public abstract slass Cteator 应为 public abstract class Cteator 属于书写错误。在此谢谢Ricky!
回复
引用
查看
#3楼
2007-01-17 11:15 |
ddd [未注册用户]
Cteator????Creator
回复
引用
#4楼
2008-07-25 18:16 |
misserwell [未注册用户]
你看就是楼主自己也没理解是咋回事,抄的书
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2005-08-24 09:00 编辑过
相关文章:
.NET设计模式系列文章
一个绝对有效的治疗“寻常疣(干日疮,瘊子)”的方法
使用Visual Studio2005入门.Net2.0系列视频教程
.NET设计模式(2):单件模式(Singleton Pattern)
.NET设计模式(3):抽象工厂模式(Abstract Factory)
电脑故障处理小经验—IE无法打开链接的处理方法
相关链接:
所属分类的其他文章:
Dot Net设计模式—MVC模式
用实例解说Dot Net设计模式——装饰模式
创建型模式之间的比较
.NET反射、委托技术与设计模式
Dot Net设计模式—适配器、桥接与外观三模式之间的关系
Dot Net设计模式—外观模式
如何在实际工作中发现模式(二)
如何在实际工作中发现模式(一)
Dot Net设计模式—桥接模式
Dot Net设计模式—适配器模式
最新IT新闻:
Google拟在9月发布自有浏览器 或采用火狐内核
微软正在构思将Wi-Fi带入汽车
对比测试:IE8 Beta 2 VS Firefox 3.0.1
iPhone存在严重密码安全漏洞
GC2008:星际争霸2进程报告 微调进程延续
博客园新闻频道
博客园首页
社区
清新的空气清晰的你愉快的心情陪伴你,欢迎来到梦幻Dot Net。
<
2005年8月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(24)
给我留言
查看留言
我参与的团队
Design & Pattern团队(3/848)
.NET 控件与组件开发(0/1361)
敏捷软件开发组织(0/278)
北京.NET俱乐部(2/1463)
Dot Net Web服务和Windows服务开发(0/231)
正则表达式团队(0/2)
随笔分类
.Net设计模式(21)
ASP.Net(9)
C#(12)
C#2005(2)
DotText
JavaScript(8)
Reporting Services(6)
SD Channel
SQL Server 2000(10)
Visio Studio 2005 WPF(2)
Web and Windows Service(5)
其他(7)
软件工程(7)
正则表达式(2)
随笔档案
2008年3月 (1)
2008年1月 (2)
2007年12月 (1)
2007年11月 (1)
2007年10月 (4)
2007年8月 (1)
2007年7月 (1)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (2)
2006年12月 (1)
2006年10月 (1)
2006年9月 (2)
2006年8月 (1)
2006年7月 (1)
2006年4月 (1)
2006年3月 (4)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (5)
2005年9月 (11)
2005年8月 (36)
2005年7月 (10)
文章分类
ASP.NET(2)
安全与加密(1)
管理(1)
生活(1)
数据库(2)
文章档案
2007年12月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (4)
相册
宝贝动物
精彩贴图
生活餐具
.NET技术网站
ASP.NET开发实践系列课程
ASP酷技术网
CodeProject
KnowDotNet
Visual Studio.net专栏
博客堂
发赛特技术网
酷网博客
孟宪会.NET开发者园地
太平洋开发编程技术与实例
天新网DotNet
新一代技术网
站长中国
正则表达式
中国C#技术网站
中文C#站
其他技术网
ASP.NET Forums 官方中文网站
MSDN中文站
动态网站制作指南
正则表达式网站(Eng)
中国BS网
中国Office Online
中国WEB开发者网络
数据库技术网站
SQL Server 提示与技巧
数据仓库之路
友情连接
就他吧服务
就他吧为您提供软件开发,网站设计,网站开发维护,各种办公软件、管理软件开发等等,详情请进入
http://www.9ta8.com
幽默笑话
笑话大全、智慧快餐、暴笑网文、高笑图片、恐怖故事、幽默短信、相声小品尽在其中,就他吧幽默站开心您每一天
积分与排名
积分 - 249904
排名 - 122
最新评论
1. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:yjmyzz 2.电子邮件:yjmyzz@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的开发原理,技巧以及实践经验. ...
--yjmyzz
2. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:Clefoo 2.电子邮件:clefoo@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的 ...
--Clefoo的马甲
3. re: DotNet WebService和WindowsService团队开通
我非常希望加入 1.博客园帐户名:aierong 2.电子邮件:aierong@126.com 3.博客园地址: ...
--aierong
4. re: COM+组件与COM+服务使用的区别
你好,我想请教您两个问题,关于开发COM+方面的.可以加下我QQ吗,QQ:285625240
--wangjianguo
5. re: C#几种常用的排序算法
不错啊,呵呵,理解了,谢谢你啊
--顾客
阅读排行榜
1. 正则表达式基础知识(21433)
2. 全面剖析C#正则表达式(18159)
3. C#反射实例讲解(9929)
4. .NET反射、委托技术与设计模式(9842)
5. .Net调用Java的WebService之亲身体验(9293)
评论排行榜
1. DotNet WebService和WindowsService团队开通(124)
2. 如何掌握并在实践中自如运用设计模式(51)
3. C#写的一个代码生成器(35)
4. 用.Net开发Windows服务初探(27)
5. .NET反射、委托技术与设计模式(21)
就他吧-9ta8伴您开心每一天