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

      }

}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值