使用反射前后的参数化工厂方法

来源:互联网 发布:人工智能的英文 编辑:程序博客网 时间:2024/06/10 02:54

使用反射前后的参数化工厂方法

工厂方法模式定义一个用于创建对象的接口,使得一个类的实例化延迟到其子类。带参数的工厂方法可以创建多种产品,它采用一个标识来区分要创建对象的种类,而要创建的所有对象都必须共享同一个接口,或都是某个类的子类。

.Net框架中实现Hash算法的MD5CryptoServiceProvider和SHA1CryptoServiceProvider都是从HashAlgorithm继承的子类,我们采用参数化工厂方法来返回创建的对象。其C#实现为:

public HashAlgorithm GetHashAlgorithm(string method)
{
 
switch(method)
 {
  
case "MD5":
   MD5 md5 
= new MD5CryptoServiceProvider();
   
return md5;     
   
break;
  
case "SHA1":
   SHA1 sha1 
= new SHA1CryptoServiceProvider();
   
return sha1;
   
break;
 }  
 
return null;
}

说明:使用本代码时需要导入命名空间:
using System.Security.Cryptography;

这种实现方式可以根据参数来创建不同的对象,但编写该方法的代码时,必须知道所有的子类才可以实现。如果在未来有新增的方法,则必须修改工厂方法的代码。而反射在这一点上可以发挥自己的优势。例如下面的C#代码:

public HashAlgorithm GetHashAlgorithm(string method)
{
 
string strClass="System.Security.Cryptography." + method + "CryptoServiceProvider";
 Assembly ass
=Assembly.Load("mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
 HashAlgorithm hash 
= (HashAlgorithm)ass.CreateInstance(strClass); 
 
return hash;
}

说明:使用本代码时需要导入命名空间:
using System.Security.Cryptography;
using System.Reflection;

另外下面的代码要放到配置文件的<compilation></compilation>段中。

<assemblies>
<add assembly="mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</assemblies>

上面的代码还有一些不足在于,如果更新了mscorlib库,则其Version和PublicKeyToken将会发生变化,这样同样也需要更改GetHashAlgorithm方法的代码。但毕竟mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089是一个字符串,同样也可以放到配置文件中来获取这个串。当mscorlib更新时,只要保证mscorlib实际版本与配置文件中的配置相对应即可。

如果是使用java语言,就不必使用反射了,因为它本身就提供的就是一个带参数的工厂方法。

MessageDigest sha = MessageDigest.getInstance("SHA-1");

说明:使用本代码时要导入包:
import java.security.*;