![lucky.gif](https://www.cnblogs.com/Emoticons/QQ/lucky.gif)
【使用篇】
1)定义一个产品接口
public
interface
IProduct
{![dot.gif](https://www.cnblogs.com/Images/dot.gif)
}
{
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
2)实现一个或者多个产品类
public
class
ConcreteProduct1 : IProduct
{![dot.gif](https://www.cnblogs.com/Images/dot.gif)
}
{
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
public
class
ConcreteProduct2 : IProduct
{![dot.gif](https://www.cnblogs.com/Images/dot.gif)
}
{
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
3) 定义一个工厂接口
public
interface
IProductFactory
{
// 生产方法
IProduct Create(String key);
// 销毁方法
void Release(IProduct handler);
}
{
// 生产方法
IProduct Create(String key);
// 销毁方法
void Release(IProduct handler);
}
4)定义一个配置文件
<
configuration
>
< facilities >
< facility id ="typedfactory" >
< factories >
< factory id ="productFactory" interface ="TypedFactoryDemo.IProductFactory, TypedFactoryDemo"
creation ="Create" destruction ="Release" />
</ factories >
</ facility >
</ facilities >
</ configuration >
< facilities >
< facility id ="typedfactory" >
< factories >
< factory id ="productFactory" interface ="TypedFactoryDemo.IProductFactory, TypedFactoryDemo"
creation ="Create" destruction ="Release" />
</ factories >
</ facility >
</ facilities >
</ configuration >
5)初始化容器
//
初始化一个容器
IWindsorContainer container = new WindsorContainer( " typedFactory_config.xml " );
// 加入Facility
container.AddFacility( " typedfactory " , new TypedFactoryFacility() );
// 加入产品
container.AddComponent( " prod1 " , typeof (IProduct), typeof (ConcreteProduct1) );
container.AddComponent( " prod2 " , typeof (IProduct), typeof (ConcreteProduct2) );
IWindsorContainer container = new WindsorContainer( " typedFactory_config.xml " );
// 加入Facility
container.AddFacility( " typedfactory " , new TypedFactoryFacility() );
// 加入产品
container.AddComponent( " prod1 " , typeof (IProduct), typeof (ConcreteProduct1) );
container.AddComponent( " prod2 " , typeof (IProduct), typeof (ConcreteProduct2) );
6)使用工厂
//
从容器中获取工厂
IProductFactory factory = (IProductFactory)container[ " productFacotry " ];
// 进行生产
IProduct prod1 = factory.Create( " prod1 " ); // prod1 is ConcreteProduct1
IProduct prod2 = factory.Create( " prod2 " ); // prod2 is ConcreteProduct2
IProductFactory factory = (IProductFactory)container[ " productFacotry " ];
// 进行生产
IProduct prod1 = factory.Create( " prod1 " ); // prod1 is ConcreteProduct1
IProduct prod2 = factory.Create( " prod2 " ); // prod2 is ConcreteProduct2
OK! 你不需要写任何的具体的工厂方法,也不用new任何一个具体的产品。增加一个工厂或者是增加一个产品,是不是很简单呢?想知道其中的奥秘吧,那请你继续往下看。
【原理篇】
这个Facility中有一个叫FactoryEntry的类,专门是用来收集初始化的工厂信息的。包括工厂ID、工厂接口、工厂的创建产品方法和工厂的销毁产品方法。
而在TypedFactoryFacility中,容器首先对配置的工厂初始化一个FactoryEntry工厂信息库放到工厂Model的ExtendedProperties中,然后容器会加入一个工厂接口的拦截器FactoryInterceptor,当从容器中获取一个工厂的时候,就会被拦截器拦截。
在拦截器的处理里面会自动根据工厂的创建方法名称(FactoryEntry.CreationMethod)来向容器中索取一个产品对象。又或者是销毁方法名称(FactoryEntry.DestructionMethod)在容器中ReleaseComponent一个产品对象。
除此之外,你还可以这样定义工厂接口:
public
interface
IProductFactory
{
// 生产方法
ConcreteProduct Create();
}
{
// 生产方法
ConcreteProduct Create();
}
如果你想要自己的工厂生产方法,那也完全没问题,只要你实现自己的工厂方法而方法的名称和配置文件中的creation或者destruction指定的方法名称不同就可以了。
【后记】
此外,在看源码过程中,有两处是值得探讨的。由于前项目阶段性完成,今天要回深圳,所以我就贴出来让大家看下,一起研究研究。xixi :)
//
是这样得到工厂类型的
ITypeConverter converter = (ITypeConverter)_kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
Type factoryType = (Type)converter.PerformConversion( config.Attributes[ " interface " ], typeof (Type) );
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
// Empty 是个空类哦~
ComponentModel model = new ComponentModel(entry.Id, entry.FactoryInterface, typeof (Empty));
ITypeConverter converter = (ITypeConverter)_kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
Type factoryType = (Type)converter.PerformConversion( config.Attributes[ " interface " ], typeof (Type) );
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
// Empty 是个空类哦~
ComponentModel model = new ComponentModel(entry.Id, entry.FactoryInterface, typeof (Empty));
see you then~
![14.gif](https://www.cnblogs.com/Emoticons/QQ/14.gif)