Castle IOC容器实践之TypedFactory Facility(一)

摘要:相信大家对于Factory Method设计模式都已经不陌生了,在Factory Method中,对于每一个具体的产品都需要有一个与之对应的工厂类,随着具体的产品越来越多,我们对于工厂类的管理就越来越困难,那如何通过IOC容器来实现对工厂的管理呢?本文将给你答案,通过TypedFactory Facility来实现。

 

主要内容

1TypedFactory Facility概述

2TypedFactory Facility快速入门

 

一.TypedFactory Facility概述

相信大家对于Factory Method设计模式都已经不陌生了,在Factory Method中,对于每一个具体的产品都需要有一个与之对应的工厂类,随着具体的产品越来越多,我们对于工厂类的管理就越来越困难,那如何通过IOC容器来实现对工厂的管理呢?本文将给你答案。在开始使用之前,我们还是先来看一下Castle官方网站中给出的有关TypedFactory Facility的信息:

Facility Information

Uses proxy

Yes

Requires configuration

Yes

Uses attributes

No

Version

Beta 2

二.TypedFactory Facility快速入门

1.创建产品接口

 

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>

None.gif
None.gif
public   interface  IProduct
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
void Display();
ExpandedBlockEnd.gif}


2.定义多个具体的产品,实现于接口Iproduct

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>

None.gif
None.gif
public   class  ConcreteProductA : IProduct
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public void Display()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        Console.WriteLine(
"ConcreteProductAdot.gif");
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

 

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>
None.gif
None.gif
public   class  ConcreteProductB : IProduct
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public void Display()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine(
"ConcreteProductBdot.gif");
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

 

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>
None.gif
None.gif
public   class  ConcreteProductC : IProduct
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public void Display()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine(
"ConcreteProductCdot.gif");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}


3
.定义工厂接口

在工厂接口中,只有一个方法Create()

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>
None.gif
None.gif
public   interface  IFactory
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// 创建方法
InBlock.gif

InBlock.gif    IProduct Create(
string id);
ExpandedBlockEnd.gif}


当然了我们也可以为组件加上一个释放的方法Release()

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>
None.gif
None.gif
public   interface  IFactory
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// 创建方法
InBlock.gif
    IProduct Create(string id);
InBlock.gif
InBlock.gif
InBlock.gif    
// 销毁方法
InBlock.gif
    void Release(IProduct handler);
ExpandedBlockEnd.gif}


4.创建配置文件

在开始的Facility信息中,可以看到TypedFactory Facility是需要配置信息

None.gif <!-- /* 
None.gif
None.gif    Author:Terrylee
None.gif
None.gif    Date:2006年5月12日
None.gif
None.gif    From:http://terrylee.cnblogs.com
None.gif
None.gif*/
-->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>  
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="typedfactory" >
None.gif
None.gif            
< factories >
None.gif
None.gif                
< factory  id ="factory"  interface ="TypedFactoryFacilityDemo.IFactory, TypedFactoryFacilityDemo"
None.gif
None.gif                    creation
="Create"  destruction ="Release"   />
None.gif
None.gif            
</ factories >
None.gif
None.gif        
</ facility >
None.gif
None.gif    
</ facilities >
None.gif
None.gif
</ configuration >


5.使用TypedFactory Facility

有了前面几步的准备,现在就可以使用了,只需要注册Facility就可以了,容器会自动根据配置信息来注册工厂类的实现

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:http://terrylee.cnblogs.com
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>
None.gif
None.gif
public   class  App
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// 初始化容器
InBlock.gif

InBlock.gif        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("http://www.cnblogs.com/MyConfig.xml") );
InBlock.gif
InBlock.gif
InBlock.gif        
// 加入TypedFactory Facility
InBlock.gif

InBlock.gif        container.AddFacility( 
"typedfactory"new TypedFactoryFacility() );
InBlock.gif
InBlock.gif 
InBlock.gif        
// 加入具体产品
InBlock.gif

InBlock.gif        container.AddComponent( 
"proda"typeof(IProduct), typeof(ConcreteProductA) );
InBlock.gif
InBlock.gif        container.AddComponent( 
"prodb"typeof(IProduct), typeof(ConcreteProductB) );
InBlock.gif
InBlock.gif        container.AddComponent( 
"prodc"typeof(IProduct), typeof(ConcreteProductC) );
InBlock.gif
InBlock.gif        
InBlock.gif        
// 获取工厂实例
InBlock.gif

InBlock.gif        IFactory factory 
= (IFactory)container["factory"];
InBlock.gif
InBlock.gif        
InBlock.gif        
// 使用具体产品
InBlock.gif

InBlock.gif        IProduct pa 
= factory.Create("proda");
InBlock.gif
InBlock.gif        pa.Display();
InBlock.gif
InBlock.gif
InBlock.gif        IProduct pb 
= factory.Create("prodb");
InBlock.gif
InBlock.gif        pb.Display();
InBlock.gif
InBlock.gif
InBlock.gif        IProduct pc 
= factory.Create("prodc");
InBlock.gif
InBlock.gif        pc.Display();
InBlock.gif
InBlock.gif
InBlock.gif        Console.ReadLine();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}


完整的TypedFactory Facility使用过程就是这样的,可以看到,从始至终在程序中只出现了一个工厂类的接口,并没有为每一个具体的产品创建一个工厂类,但是最后我们却可以像使用具体工厂类那样使用工厂的实例。同时,如果我们需要再新增一个新的产品就非常简单了。在这里还需要注意的一点就是在获取工厂的实例时所用到的Key应该是在配置文件中<factory>节点中配置的工厂ID,而不能是FacilityID!本篇文章就到这里,下一篇我会介绍TypedFactory Facility的实现原理,希望感兴趣的朋友关注!

 

下篇:Castle IOC容器实践之TypedFactory Facility(二)

本文代码下载:/Files/Terrylee/TypedFactoryFacilityDemo.rar

 

参考资料

Castle的官方网站http://www.castleproject.org

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值