• 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.创建产品接口


    /// <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("http://www.cnblogs.com/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,而不能是FacilityID!本篇文章就到这里,下一篇我会介绍TypedFactory Facility的实现原理,希望感兴趣的朋友关注!

     

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

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

     

    参考资料

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

  • 相关阅读:
    深入理解javascript的this关键字
    很简单的JQuery网页换肤
    有关垂直居中
    层的半透明实现方案
    常用meta整理
    web前端页面性能优化小结
    关于rem布局以及sprit雪碧图的移动端自适应
    mysql入过的坑
    日期格式化函数
    基于iframe父子页面传值的方法。
  • 原文地址:https://www.cnblogs.com/Terrylee/p/399586.html
Copyright © 2020-2023  润新知