主要內容
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
二.TypedFactory Facility快速入門
1.創建產品接口
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IProduct
{
void Display();
}
2.定義多個具體的產品,實現於接口Iproduct
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductA : IProduct
{
public void Display()
{
Console.WriteLine("ConcreteProductA");
}
}
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductB : IProduct
{
public void Display()
{
Console.WriteLine("ConcreteProductB");
}
}
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductC : IProduct
{
public void Display()
{
Console.WriteLine("ConcreteProductC");
}
}
3.定義工廠接口
在工廠接口中,只有一個方法Create()
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IFactory
{
// 創建方法
IProduct Create(string id);
}
當然了我們也可以為組件加上一個釋放的方法Release()
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IFactory
{
// 創建方法
IProduct Create(string id);
// 銷毀方法
void Release(IProduct handler);
}
4.創建配置文件
在開始的Facility信息中,可以看到TypedFactory Facility是需要配置信息
<!--/*
Author:Terrylee
Date:2006年5月12日
From:http://terrylee.cnblogs.com
*/-->
<?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:http://terrylee.cnblogs.com
/// </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的實現原理,希望感興趣的朋友關注!
本文配套源碼