使用反射前后的参数化工厂方法
工厂方法模式定义一个用于创建对象的接口,使得一个类的实例化延迟到其子类。带参数的工厂方法可以创建多种产品,它采用一个标识来区分要创建对象的种类,而要创建的所有对象都必须共享同一个接口,或都是某个类的子类。
.Net框架中实现Hash算法的MD5CryptoServiceProvider和SHA1CryptoServiceProvider都是从HashAlgorithm继承的子类,我们采用参数化工厂方法来返回创建的对象。其C#实现为:
{
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#代码:
{
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.*;