Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188227
  • 博文数量: 106
  • 博客积分: 3810
  • 博客等级: 中校
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 13:35
文章分类

全部博文(106)

文章存档

2014年(17)

2011年(5)

2010年(75)

2009年(9)

我的朋友

分类:

2011-01-20 21:04:20

  前天看了一个设计模式视频,是用Java实现简单工厂模式,要是用if……else来判断的话,改到.net下也是很好实现的,但是在Java里面用到了 反射的机制,这样就省去了工厂内部或是客户端内对要生产东西的判断。直接根据传进来的参数既可以完成生产。下面我给出我做的例子,先给出一般的通过if ……else来判断的:

Imports System.Reflection
Imports System.ComponentModel
Module SimpleFactory
    Sub Main()
        Dim objCar As Object = Factory.getCarInstance("Benz")
        If objCar IsNot Nothing Then
            objCar.run()
            objCar.finish()
        Else
            Console.WriteLine("没有这种汽车")
        End If
        Console.Read()
    End Sub
End Module
Class Factory
    Public Shared Function getCarInstance(ByVal type As String)
        Dim myCar As Object = Nothing
        Try
            If (type = "Benz") Then
                myCar = New Benz
            ElseIf (type = "Ford") Then
                myCar = New Ford
            End If
        Catch ex As Exception
            MsgBox("出错:" + ex.Message)
        End Try
        Return myCar
    End Function
End Class
Interface Car
    Sub run()
    Sub finish()
End Interface
Public Class Benz : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Benz生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Benz开始生产。。。。")
    End Sub
End Class
Public Class Ford : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Ford生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Ford开始生产。。。。")
    End Sub
End Class
Imports System.Reflection
Imports System.ComponentModel
Module SimpleFactory
    Sub Main()
        Dim objCar As Object = Factory.getCarInstance("Benz")
        If objCar IsNot Nothing Then
            objCar.run()
            objCar.finish()
        Else
            Console.WriteLine("没有这种汽车")
        End If
        Console.Read()
    End Sub
End Module
Class Factory
    Public Shared Function getCarInstance(ByVal type As String)
        Dim myCar As Object = Nothing
        Try
            If (type = "Benz") Then
                myCar = New Benz
            ElseIf (type = "Ford") Then
                myCar = New Ford
            End If
        Catch ex As Exception
            MsgBox("出错:" + ex.Message)
        End Try
        Return myCar
    End Function
End Class
Interface Car
    Sub run()
    Sub finish()
End Interface
Public Class Benz : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Benz生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Benz开始生产。。。。")
    End Sub
End Class
Public Class Ford : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Ford生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Ford开始生产。。。。")
    End Sub
End Class

这样就可以通过if判断来生产不同的汽车。但是如果要在添加新的汽车类呢?比如说要添加一个Bus类,就必须得改动Factory类。这在设计模式上是不合理的,因为“对修改封闭-对扩充开放”

那么在vb.net中如何使用反射机制呢?

下面给出我的例子:

首先是建立一个类库命名为SimpleCar,代码如下:

Interface Car
    Sub run()
    Sub finish()
End Interface
Public Class Benz : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Benz生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Benz开始生产。。。。")
    End Sub
End Class
Public Class Ford : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Ford生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Ford开始生产。。。。")
    End Sub
End Class
Interface Car
    Sub run()
    Sub finish()
End Interface
Public Class Benz : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Benz生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Benz开始生产。。。。")
    End Sub
End Class
Public Class Ford : Implements Car
    Public Sub finish() Implements Car.finish
        Console.WriteLine("Ford生产好了。。。。")
    End Sub
    Public Sub run() Implements Car.run
        Console.WriteLine("Ford开始生产。。。。")
    End Sub
End Class


然后生成解决方案。

新建一个控制台程序:


Imports System.Reflection
Imports System.ComponentModel
Module SimpleFactory
    Sub Main()
        Dim aCar As Object = Factory.getCarInstance("Benz")
        If aCar IsNot Nothing Then
            aCar.run()
            aCar.finish()
        Else
            Console.WriteLine("没有这种汽车")
        End If
        Console.Read()
    End Sub
End Module
Class Factory
    Public Shared Function getCarInstance(ByVal type As String)
        Dim myDll As [Assembly]
        Dim objCar As Object = Nothing
        '将生成的dll加载进来
        myDll = [Assembly].LoadFrom _
                ("F:\我的vs2008\pattern\SimpleCar\SimpleCar\bin\Debug\SimpleCar.dll")
        '通过传递的参数生成相应的类
        objCar = myDll.CreateInstance("SimpleCar." + type)
        Return objCar
    End Function
End Class
Imports System.Reflection
Imports System.ComponentModel
Module SimpleFactory
    Sub Main()
        Dim aCar As Object = Factory.getCarInstance("Benz")
        If aCar IsNot Nothing Then
            aCar.run()
            aCar.finish()
        Else
            Console.WriteLine("没有这种汽车")
        End If
        Console.Read()
    End Sub
End Module
Class Factory
    Public Shared Function getCarInstance(ByVal type As String)
        Dim myDll As [Assembly]
        Dim objCar As Object = Nothing
        '将生成的dll加载进来
        myDll = [Assembly].LoadFrom _
                ("F:\我的vs2008\pattern\SimpleCar\SimpleCar\bin\Debug\SimpleCar.dll")
        '通过传递的参数生成相应的类
        objCar = myDll.CreateInstance("SimpleCar." + type)
        Return objCar
    End Function
End Class

这样就可以不用if……else来判断就可以生成相应的类了。

但是这个并没有解决我的疑问,因为在Java中可以通过制定相应的包和类就可达到反射的效果,但是在vb.net中还得生成dll才行。我想应该还有别的方法,要不修改dll文件也不是容易的事。不过相对来说比if……else更为灵活一些。

下面是Java的简单工厂代码:


package org.jzkangta.factorydemo03;
 
 
interface Car{
    public void run();
    public void stop();
}
 
class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}
 
class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}
 
class Toyota implements Car{
    public void run(){
        System.out.println("Toyota开始启动了。。。");
    }
    public void stop(){
        System.out.println("Toyota停车了。。。。");
    }
}
 
class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
            c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }
      
        return c;
    }
}
public class FactoryDemo03 {
 
    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
          
 
    }


阅读(1457) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-07 13:26:56

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com