摘要:相信大家對于Factory Method設計模式都已經不陌生了,在Factory Method中,對于每一個具體的産品都需要有一個與之對應的工廠類,随着具體的産品越來越多,我們對于工廠類的管理就越來越困難,那如何通過IOC容器來實作對工廠的管理呢?本文将給你答案,通過TypedFactory Facility來實作。
主要内容
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.建立産品接口
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public interface IProduct
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) void Display();
Castle IOC容器實踐之TypedFactory Facility(一) }
2.定義多個具體的産品,實作于接口Iproduct
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public class ConcreteProductA : IProduct
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) public void Display()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) Console.WriteLine("ConcreteProductA
Castle IOC容器實踐之TypedFactory Facility(一) ");
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public class ConcreteProductB : IProduct
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) public void Display()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) Console.WriteLine("ConcreteProductB
Castle IOC容器實踐之TypedFactory Facility(一) ");
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public class ConcreteProductC : IProduct
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) public void Display()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) Console.WriteLine("ConcreteProductC
Castle IOC容器實踐之TypedFactory Facility(一) ");
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一) }
3.定義工廠接口
在工廠接口中,隻有一個方法Create()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public interface IFactory
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) // 建立方法
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IProduct Create(string id);
Castle IOC容器實踐之TypedFactory Facility(一) }
當然了我們也可以為元件加上一個釋放的方法Release()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public interface IFactory
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) // 建立方法
Castle IOC容器實踐之TypedFactory Facility(一) IProduct Create(string id);
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) // 銷毀方法
Castle IOC容器實踐之TypedFactory Facility(一) void Release(IProduct handler);
Castle IOC容器實踐之TypedFactory Facility(一) }
4.建立配置檔案
在開始的Facility資訊中,可以看到TypedFactory Facility是需要配置資訊
Castle IOC容器實踐之TypedFactory Facility(一) <!-- -->
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) <? xml version="1.0" encoding="utf-8" ?>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) < configuration >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) < facilities >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) < facility id ="typedfactory" >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) < factories >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) < factory id ="factory" interface ="TypedFactoryFacilityDemo.IFactory, TypedFactoryFacilityDemo"
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) creation ="Create" destruction ="Release" />
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) </ factories >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) </ facility >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) </ facilities >
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) </ configuration >
5.使用TypedFactory Facility
有了前面幾步的準備,現在就可以使用了,隻需要注冊Facility就可以了,容器會自動根據配置資訊來注冊工廠類的實作
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// <summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Author:Terrylee
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// Date:2006年5月12日
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// From:http://terrylee.cnblogs.com
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) /// </summary>
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) public class App
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) public static void Main()
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) {
Castle IOC容器實踐之TypedFactory Facility(一) // 初始化容器
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IWindsorContainer container = new WindsorContainer(new XmlInterpreter("http://www.cnblogs.com/MyConfig.xml") );
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) // 加入TypedFactory Facility
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) container.AddFacility( "typedfactory", new TypedFactoryFacility() );
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) // 加入具體産品
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) container.AddComponent( "proda", typeof(IProduct), typeof(ConcreteProductA) );
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) container.AddComponent( "prodb", typeof(IProduct), typeof(ConcreteProductB) );
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) container.AddComponent( "prodc", typeof(IProduct), typeof(ConcreteProductC) );
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) // 擷取工廠執行個體
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IFactory factory = (IFactory)container["factory"];
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) // 使用具體産品
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IProduct pa = factory.Create("proda");
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) pa.Display();
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IProduct pb = factory.Create("prodb");
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) pb.Display();
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) IProduct pc = factory.Create("prodc");
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) pc.Display();
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一) Console.ReadLine();
Castle IOC容器實踐之TypedFactory Facility(一) }
Castle IOC容器實踐之TypedFactory Facility(一) }
完整的TypedFactory Facility使 用過程就是這樣的,可以看到,從始至終在程式中隻出現了一個工廠類的接口,并沒有為每一個具體的産品建立一個工廠類,但是最後我們卻可以像使用具體工廠類 那樣使用工廠的執行個體。同時,如果我們需要再新增一個新的産品就非常簡單了。在這裡還需要注意的一點就是在擷取工廠的執行個體時所用到的Key應該是在配置檔案中<factory>節點中配置的工廠ID,而不能是Facility的ID!本篇文章就到這裡,下一篇我會介紹TypedFactory Facility的實作原理,希望感興趣的朋友關注!
下篇:Castle IOC容器實踐之TypedFactory Facility(二)
本文代碼下載下傳:/Files/Terrylee/TypedFactoryFacilityDemo.rar
參考資料
Castle的官方網站http://www.castleproject.org