实现插件架构
一种更复杂的工厂是插件工厂.这种插件工厂用于实例化那些从配置文件中抽取而来的文本定义的类型.插件工厂很灵活,并且是分离意图和实现的行之有效的方式(一般会使用桥模式Bridge Pattern).
从使用使用者的角度,使用插件工厂实例化接口实例的方式如下:
ITaxation obj = Factory.GetObject<ITaxation>("Taxation.SwissTaxationImpl");
可见,插件工厂是普通使用的优雅的方案.
插件工厂的实现比较复杂,因为必须实现多个动作:
1.确认使用使用者和实现共享的泛型类型。将使用者和实现绑定在一起的是接口,默认基类或者泛型类型。泛型类型应该存储在一个单独的可以被才者引用的程序集内。
2。确认程序集。接口实现位于单独程序集中,该程序集需要在实例化接口实例的时候被加载.
3.当有要求时加载程序集,实例化对象并且将类型转换到泛型类型.
下面是加载程序集的例子:
Assembly assembly = Assembly.LoadFrom(path);
LoadFrom是个静态方法,它根据存储在path变量中的路径加载程序集。程序集加载完毕后,可以使用下面的方法调用来实例化程序集内实现的类型:
object obj = assembly.CreateInstance(typeidentifier);
实例化的类型是变更typeidentifier中基于文本的标识符。例如可能是否Taxation.SwissTaxationImpl。如果可以实例化这个类型,那么对象实例就会存储在在变量obj中。如果不能实例化这个对象,那么变更obj就会是null.
另外一个动态加载并实例化对象实例的方案是使用Activeator类,如下:
object obj = Activeator.CreateInstance(Type.GetType(typeidentifier));
当从Activator类调用时,CreateInstance方法要求是一个.NET类型实例。这个类型实例由变更typeidentifier标识,此变更是个字符串,它有个特别的符号:"{type name,{Assembly path}".返回的是一个对象实例.
Bulder模式的主要思路是创建一整套对象的实例,并建立之间的关系.如
public class Builder {
public ITaxation = new SwissTaxationImpl()
{
ITaxation taxation = new SwissTaxationImpl();
taxation .TaxMath = new SwissTaxMathImpl();
return taxation;
}
克隆对象
在.NET中,克隆一个对象的访求是实现ICloneable接口.
class SwissTaxationImpl :ITaxation,System.ICloneable
{
public Object Clone()
{
SwissTaxationImpl obj = (SwissTaxationImpl)this.MemberwiseClone();
obj._taxMath =(ITaxMath)((System.ICloneable)_taxMath).Clone();
return obj;
}
方法Clone()同时实现了深克隆和浅克隆.浅克隆是指仅仅复制类型的本地数据成员,它是调用方法MemberwiseClone来实现的。为了实现深克隆,要调用类的数据成员的Clone方法
}
摘自 .NET 2.0模式开发实战