您的位置:首页 > 编程语言 > VB

vb.net 中通过反射实现简单工厂模式

2009-11-07 09:39 746 查看
前天看了一个设计模式视频,是用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



这样就可以通过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



然后生成解决方案。
新建一个控制台程序:

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("造不了这种汽车。。。");
		}
		

	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: