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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:相信大家对于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 .创建产品接口

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

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

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

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

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

ExpandedBlockEnd.gif}
 

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

None.gif
None.gif
public   class  ConcreteProductB : IProduct
ExpandedBlockStart.gif
{
InBlock.gif    
public void Display()
ExpandedSubBlockStart.gif    
{
InBlock.gif        Console.WriteLine(
"ConcreteProductBdot.gif");
InBlock.gif
ExpandedSubBlockEnd.gif    }

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

None.gif
None.gif
public   class  ConcreteProductC : IProduct
ExpandedBlockStart.gif
{
InBlock.gif    
public void Display()
ExpandedSubBlockStart.gif    
{
InBlock.gif        Console.WriteLine(
"ConcreteProductCdot.gif");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

3
.定义工厂接口

在工厂接口中,只有一个方法Create()
ExpandedBlockStart.gif /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:[url]http://terrylee.cnblogs.com[/url]
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>

None.gif
None.gif
public   interface  IFactory
ExpandedBlockStart.gif
{
InBlock.gif    
// 创建方法
InBlock.gif

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

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

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

None.gif
None.gif
public   interface  IFactory
ExpandedBlockStart.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:[url]http://terrylee.cnblogs.com[/url]
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 /// <summary>
InBlock.gif
InBlock.gif
/// Author:Terrylee
InBlock.gif
InBlock.gif
/// Date:2006年5月12日
InBlock.gif
InBlock.gif
/// From:[url]http://terrylee.cnblogs.com[/url]
InBlock.gif
ExpandedBlockEnd.gif
/// </summary>

None.gif
None.gif
public   class  App
ExpandedBlockStart.gif
{
InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gif    
{
InBlock.gif        
// 初始化容器
InBlock.gif

InBlock.gif        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("../../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的实现原理,希望感兴趣的朋友关注!







本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67687 ,如需转载请自行联系原作者




相关文章
|
5天前
|
Java 测试技术 开发者
IoC容器有什么作用?
【4月更文挑战第30天】IoC容器有什么作用?
18 0
|
4天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第1天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效、稳定且可扩展的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作的影响,随后详细介绍了容器化技术的基本概念、优势以及在现代云环境中的关键作用。接着,文中以一系列真实案例为基础,分析了将DevOps与容器化相结合时所面临的挑战和解决方案,并提出了一套实施框架。最后,文章总结了这种融合实践对提高运维效率、加快产品上市速度和保障系统稳定性的积极影响,同时对未来的技术趋势进行了展望。
|
4天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
4天前
|
Kubernetes Devops Docker
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今快速迭代和持续交付的软件发展环境中,传统的IT运维模式已不足以满足企业对效率和稳定性的双重需求。本文将深入探讨如何通过整合DevOps理念和容器化技术来构建一个既高效又稳定的云基础设施。文中不仅阐述了DevOps的核心原则、流程自动化的重要性以及容器化技术的基础知识,还提供了一个详细的实施案例,帮助读者理解这两种技术如何协同工作,以支持复杂的应用程序部署和管理。
|
5天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。
|
5天前
|
Java 开发者 容器
IoC容器如何实现依赖注入?
【4月更文挑战第30天】IoC容器如何实现依赖注入?
14 0
|
5天前
|
XML Java 数据格式
如何配置IoC容器?
【4月更文挑战第30天】如何配置IoC容器?
13 0
|
8天前
|
存储 监控 安全
【专栏】Docker Compose:轻松实现容器编排的利器
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
6天前
|
存储 虚拟化 数据中心
|
8天前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。