• 首页
  • 产品与方案
  • 众成服务
  • 走进众成
  • 新闻中心
  • 企业文化
  • 联系我们
  • 解决方案
  • 众成软件
  • 维护支持
  • 运维服务
  • 技术交流
  • 公司介绍
  • 荣誉资质
  • 合作伙伴
  • 招贤纳士
  • 公司新闻
  • 业界动态
  • 文化建设
  • 企业文化
  • 荣誉榜

首页 > 产品与方案 > 众成软件

众成软件

NET设计模式之工厂方法模式

 作者:   文章来源:黄晓锋    点击数:  更新时间:2018-01-24 14:11:36

引言

  工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法经常用于创建与某个类相关的类的实例,.NET中的数据库连接对象就是产生数据命令对象的工厂,其中的CreateCommand方法就是工厂方法。

  在IDbConnection中定义了产生IdbCommand对象的工厂方法CreateCommand,具体的Command对象由具体的Connection对象创建。它与具体的数据库相关,不同数据库创建不同类型的Command对象。

  IdbConnection定义了CreateCommand的接口:IdbConnectioCreateCommad( );

  具体的Connection类中定义了对应的实现,例如针对Oracle数据库:publicOracleCommandCreateCommand( ); 

概述

意图

  定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类,这个接口所指的是一个抽象方法。该方法说明需要创建一个对象,但并不给出具体的创建方法和创建什么类型的对象。

  C#的代码如下:

 

Using System;

Namespace CshapeCreator

{

 publicabstractslassCteator

 {

  publicabstract Production FactoryMathod();

 }

 publicclassConcreteCreator:Creator

 {

  publicoverride Production FactoryMathod()

  {

   returnnewConcreteProduction();

  }

 }

}

 

使用场合

  当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,可以使用工厂方法。

结构

  工厂方法模式的部分只是Factory Method()。在Create中定义这个方法的接口,在ConcreteCreator中实现这个方法。如果没有这个方法,则不是工厂方法模式。还需要说明的是,Creator的职责并非只是创建一个产品,它经常同时还包含模板方法。即模式仅限于方法部分,这也是为什么叫做“工厂方法”的原因。它与抽象工厂和构造器不同,二者都有工厂类。在使用时都需要将工厂类的实例作为参数传递给被使用者,由被使用者做产品的实例化工作,当然这些模式中可能会用到工厂方法模式。

效果

  工厂方法使类中的代码不依赖于它必须创建的类,代码只要知道它需要创建的类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。

.NET中的工厂方法——获得迭代器

  .NET中的集合和列表等聚合都提供了对自身进行遍历访问的迭代方法,集合实现Ienumerable接口,而迭代器实现Ienumerator接口。因为迭代器不能脱离聚合独立存在,所以其本身没有公开的构造函数,只能通过聚合创建。不同的聚合采用不同的迭代器,在Ienumerable中定义了产生迭代器的接口,即工厂方法。

  实现IEnumerable接口的类,如ArrayList等集合类实现了GetEnumerator函数,即实现了工厂方法的具体实现。根据不同的类,获得不同的Ienumerator。例如,ArrayList中的GetEnumerator返回的IEnumerator是ArrayListEnumeratorSimple,Sting中的GetEnumerator 返回的Ienumerator是 CharEnumerator:

 

using System;

usingSystem.Collections;

namespace Enumerator

{

 publicclass Class1

 {

  [STAThread]

  staticvoid Main(sting[] args)

  {

   ArrayList a = newArrayList();

   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 ();

  }

 }

}

 

  在这里,工厂方法起到了连接类层次的作用。

下载此文档:NET设计模式之工厂方法模式-黄晓锋   类型:docx,   大小:19 KB
  • 地址:温州市车站大道大诚商厦E幢四楼 | 电话:0577-88891333 | 技术服务电话:4008515159 | 传真:0577-88363999
  • 邮箱:jucher@jucher.com | 浙ICP备05000620号-1
  • Copyright © 2009-2019 JUCHER CORPORATION CO., LTD All Rights Reserve