Castle IOC容器实践之TypedFactory Facility(一)
生活随笔
收集整理的這篇文章主要介紹了
Castle IOC容器实践之TypedFactory Facility(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:相信大家對于Factory Method設計模式都已經不陌生了,在Factory Method中,對于每一個具體的產品都需要有一個與之對應的工廠類,隨著具體的產品越來越多,我們對于工廠類的管理就越來越困難,那如何通過IOC容器來實現對工廠的管理呢?本文將給你答案,通過TypedFactory Facility來實現。<?XML:NAMESPACE PREFIX = O />
二.TypedFactory Facility快速入門 1.創建產品接口
/**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IProduct
{
????void?Display();
}
2.定義多個具體的產品,實現于接口Iproduct /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductA?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductA");
????}
} /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductB?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductB");
????}
} ? /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductC?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductC");
????}
}
3.定義工廠接口 在工廠接口中,只有一個方法Create() /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IFactory
{
????//?創建方法
????IProduct?Create(string?id);
}
當然了我們也可以為組件加上一個釋放的方法Release() /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IFactory
{
????//?創建方法
????IProduct?Create(string?id);
????//?銷毀方法
????void?Release(IProduct?handler);
}
4.創建配置文件 在開始的Facility信息中,可以看到TypedFactory Facility是需要配置信息 <!--/*?
????Author:Terrylee
????Date:2006年5月12日
????From:[url]http://terrylee.cnblogs.com[/url]
*/-->
<?xml?version="1.0"?encoding="utf-8"??>?
<configuration>
????<facilities>
????????<facility?id="typedfactory">
????????????<factories>
????????????????<factory?id="factory"?interface="TypedFactoryFacilityDemo.IFactory,?TypedFactoryFacilityDemo"
????????????????????creation="Create"?destruction="Release"?/>
????????????</factories>
????????</facility>
????</facilities>
</configuration>
5.使用TypedFactory Facility 有了前面幾步的準備,現在就可以使用了,只需要注冊Facility就可以了,容器會自動根據配置信息來注冊工廠類的實現 /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?App
{
????public?static?void?Main()
????{
????????//?初始化容器
????????IWindsorContainer?container?=?new?WindsorContainer(new?XmlInterpreter("../../MyConfig.xml")?);
????????//?加入TypedFactory?Facility
????????container.AddFacility(?"typedfactory",?new?TypedFactoryFacility()?);
?
????????//?加入具體產品
????????container.AddComponent(?"proda",?typeof(IProduct),?typeof(ConcreteProductA)?);
????????container.AddComponent(?"prodb",?typeof(IProduct),?typeof(ConcreteProductB)?);
????????container.AddComponent(?"prodc",?typeof(IProduct),?typeof(ConcreteProductC)?);
????????
????????//?獲取工廠實例
????????IFactory?factory?=?(IFactory)container["factory"];
????????
????????//?使用具體產品
????????IProduct?pa?=?factory.Create("proda");
????????pa.Display();
????????IProduct?pb?=?factory.Create("prodb");
????????pb.Display();
????????IProduct?pc?=?factory.Create("prodc");
????????pc.Display();
????????Console.ReadLine();
????}
}
完整的TypedFactory Facility使用過程就是這樣的,可以看到,從始至終在程序中只出現了一個工廠類的接口,并沒有為每一個具體的產品創建一個工廠類,但是最后我們卻可以像使用具體工廠類那樣使用工廠的實例。同時,如果我們需要再新增一個新的產品就非常簡單了。在這里還需要注意的一點就是在獲取工廠的實例時所用到的Key應該是在配置文件中<factory>節點中配置的工廠ID,而不能是Facility的ID!本篇文章就到這里,下一篇我會介紹TypedFactory Facility的實現原理,希望感興趣的朋友關注! ?著作權歸作者所有:來自51CTO博客作者lihuijun的原創作品,如需轉載,請注明出處,否則將追究法律責任 休閑 實踐 Castle
?
主要內容 1.TypedFactory Facility概述 2.TypedFactory 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 |
/**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IProduct
{
????void?Display();
}
2.定義多個具體的產品,實現于接口Iproduct /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductA?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductA");
????}
} /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductB?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductB");
????}
} ? /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?ConcreteProductC?:?IProduct
{
????public?void?Display()
????{
????????Console.WriteLine("ConcreteProductC");
????}
}
3.定義工廠接口 在工廠接口中,只有一個方法Create() /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IFactory
{
????//?創建方法
????IProduct?Create(string?id);
}
當然了我們也可以為組件加上一個釋放的方法Release() /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?interface?IFactory
{
????//?創建方法
????IProduct?Create(string?id);
????//?銷毀方法
????void?Release(IProduct?handler);
}
4.創建配置文件 在開始的Facility信息中,可以看到TypedFactory Facility是需要配置信息 <!--/*?
????Author:Terrylee
????Date:2006年5月12日
????From:[url]http://terrylee.cnblogs.com[/url]
*/-->
<?xml?version="1.0"?encoding="utf-8"??>?
<configuration>
????<facilities>
????????<facility?id="typedfactory">
????????????<factories>
????????????????<factory?id="factory"?interface="TypedFactoryFacilityDemo.IFactory,?TypedFactoryFacilityDemo"
????????????????????creation="Create"?destruction="Release"?/>
????????????</factories>
????????</facility>
????</facilities>
</configuration>
5.使用TypedFactory Facility 有了前面幾步的準備,現在就可以使用了,只需要注冊Facility就可以了,容器會自動根據配置信息來注冊工廠類的實現 /**////?<summary>
///?Author:Terrylee
///?Date:2006年5月12日
///?From:[url]http://terrylee.cnblogs.com[/url]
///?</summary>
public?class?App
{
????public?static?void?Main()
????{
????????//?初始化容器
????????IWindsorContainer?container?=?new?WindsorContainer(new?XmlInterpreter("../../MyConfig.xml")?);
????????//?加入TypedFactory?Facility
????????container.AddFacility(?"typedfactory",?new?TypedFactoryFacility()?);
?
????????//?加入具體產品
????????container.AddComponent(?"proda",?typeof(IProduct),?typeof(ConcreteProductA)?);
????????container.AddComponent(?"prodb",?typeof(IProduct),?typeof(ConcreteProductB)?);
????????container.AddComponent(?"prodc",?typeof(IProduct),?typeof(ConcreteProductC)?);
????????
????????//?獲取工廠實例
????????IFactory?factory?=?(IFactory)container["factory"];
????????
????????//?使用具體產品
????????IProduct?pa?=?factory.Create("proda");
????????pa.Display();
????????IProduct?pb?=?factory.Create("prodb");
????????pb.Display();
????????IProduct?pc?=?factory.Create("prodc");
????????pc.Display();
????????Console.ReadLine();
????}
}
完整的TypedFactory Facility使用過程就是這樣的,可以看到,從始至終在程序中只出現了一個工廠類的接口,并沒有為每一個具體的產品創建一個工廠類,但是最后我們卻可以像使用具體工廠類那樣使用工廠的實例。同時,如果我們需要再新增一個新的產品就非常簡單了。在這里還需要注意的一點就是在獲取工廠的實例時所用到的Key應該是在配置文件中<factory>節點中配置的工廠ID,而不能是Facility的ID!本篇文章就到這里,下一篇我會介紹TypedFactory Facility的實現原理,希望感興趣的朋友關注! ?著作權歸作者所有:來自51CTO博客作者lihuijun的原創作品,如需轉載,請注明出處,否則將追究法律責任 休閑 實踐 Castle
0
微博 QQ 微信收藏
上一篇:Castle IOC容器實踐之S... 下一篇:Castle IOC容器實踐之T... lihuijun203篇文章,69W+人氣,0粉絲
轉載于:https://blog.51cto.com/terrylee/67687
總結
以上是生活随笔為你收集整理的Castle IOC容器实践之TypedFactory Facility(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将别离
- 下一篇: 使用vs2005遇到的两个错误!