就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
随笔- 96  评论- 750  文章- 16 

Dot Net 设计模式—简单工厂

1.前言
1.1概要
         简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。
        在GOF的设计模式中并没有简单工厂,而是将其作为工厂方法的一个特例加以解释。可以这样理解,简单工厂是参数化的工厂方法。

1.2使用场合
         简单工厂实例化的类具有相同的接口,类类有限并且基本不需要扩展时,可以使用简单工厂。例如,数据库连接对象,常用的数据库类类可以预知,则使用简单工厂。

1.3效果
          采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

2..NET实现
2.1实现要点

          通常简单工厂不需要实例化,而是采用静态方法。在VB.NET中称为“共享方法”,因为简单工厂一般只负责实例化工作。在C#中静态方法采用statics关键字,在VB.NET中采用Shared关键字。
         另一个实现要点不在工厂本身,而在需要被实例化的类,抽象类和接口方法可以实现对具体类的抽象。对于简单工厂而言,采用这两种方法都可以获得相同的效果。然而考虑到系统的易维护性和可扩展性,必须要讨论两种方案的优劣。
          如果需要被实例化的子类有大量相同代码,则可以考虑采用抽象类,这样可以减少代码的重复。例如,子类有大量的共有属性。然而这样做的缺点是扩展性不好,子类之间存在潜在的耦合性。因此通常的情况下可以考虑采用接口替代抽象类,具体类通过实现这个接口可以获得同样的效果。

2.2结构
假设我们要生成Vehicle的子类,结构如图所示。
                                   
         从简单工厂的结构可以看出,简单工厂依赖于所有的产品子类,带来的好处是客户只需知道产品的父类和工厂即可。
2.3代码框架
下面是代码框架:
 ‘.NET示例代码

 ‘交通工具是一个必须继承的基类
 
Public MustInherit Class Vehicle
    
Protected m-TypeName As String
    
Public Property TypeName() As String
        
Get
            
Return m-TypeName
         
End Get
         
Set(ByVal Value As String)
            m
-TypeName = Value
         
End Set
     
End Property
    
     
Public MustOverride Function Go() As String
End Class

‘汽车
Public Class Car
    
Inherits Vehicle
    
Public Sub New()
        m
-TypeName = “汽车”
    
End Sub


    
Public Overrides Function Go() As String
        
Return “汽车在公路上开”
    
End Function

End Class

‘火车
Public Class Train
    
Inherits Vehicle

    
Public Sub New()
        m
-TypeName = “火车”
    
End Sub


Public Overrides Function Go() As String
    
Return “火车在铁轨上开”
    
End Function

End Class

‘船
Public Class Boat
   
Inherits Vehicle

   
Public Sub New()
       m
-TypeName = “船”
    
End Sub

Public Overrides Function Go() As String
   
Return “船在水上走”
    
End Function

End Class


Public Class CreateAVehicle
    ‘将创建方法定义为共享
    
Public Shared Function CreateAVehicle(ByVal typeid As StringAs Vehicle
        
Dim v As Vehicle
        ‘根据参数确定需要创建的对象
        
Select Case typeid.ToLower
           
Case “car”
               V 
= New Car
           
Case “train”
               V 
= New Train
           
Case “Boat”
               V 
= New Boat
         
End Select
    
         
Return v
    
End Function

End Class
   


本节描述的是传统的实现方式,在.NET开发环境中可以采用前面讲的反射方法简化其实现。

3.简单工厂的应用
          简单工厂应用的范围很广,在一个应用中我们可以反复应用它,使程序易于维护。例如,在采用ASP .NET开发的Web应用中,为使应用支持多种类型的数据库,可以使用前面介绍的方法。这时,可以将数据库的类型和连接字串作为参数保存在Web.Config文件中。当采用的数据库类型发生变化时,只要改变这些参数即可。
         当客户需要获得一个数据库连接时,首先从Web.Config中获得数据库的类型和连接字串,然后调用相应的类实例化。
         再举个例子就是很多的电子支付平台都用到了这个模式。如果你自己开发与各家银行的接口时也应当考虑简单工厂模式了。
         这两个方案的实现代码很简单,这里就不再详细介绍了.

posted on 2005-08-04 11:49  振河  阅读(4143)  评论(1编辑  收藏

  就他吧-9ta8伴您开心每一天