A situação descrita acima se encaixa no conceito de Singleton em Best Pratices.
Então implementamos o Singleton em CFML no escopo Application, ficando assim visível para todos os usuários, ele será manipulado por dois métodos getInstance/removeInstance, inserindo este métodos no Application.cfc, da forma como está escrito aqui, ficará disponível para toda requisição, bastando apenas informar o nome do component, para que seja instanciado.
<cfset this.name = "artigo_singleton">
<cffunction name="onApplicationStart" returnType="boolean">
<cfset removeSingleton("All")>
<cfreturn true>
</cffunction>
<cffunction name="onRequest" returnType="void">
<cfargument name="targetPage" type="String" required=true/>
<cfif IsDefined("resetInstances")>
<cfset removeSingleton("All")>
</cfif>
<cfset Variables.getInstance = this.getSingleton >
<cfset Variables.removeInstance = duplicate(this.removeSingleton) >
<cfinclude template="#Arguments.targetPage#">
</cffunction>
<cffunction name="getSingleton" returnType="any">
<cfargument type="String" name="instanceName" required=true/>
<cfargument type="String" name="instanceType" required="false" default="component"/>
<cflock type="exclusive" scope="Application" timeout="10" >
<cfif Not structKeyExists(Application._singletons,arguments.instanceName)>
<cfset Application._singletons[arguments.instanceName] = CreateObject(arguments.instanceType,arguments.instanceName) >
</cfif>
</cflock>
<cfreturn Application._singletons[arguments.instanceName]>
</cffunction>
<cffunction name="removeSingleton" returnType="void">
<cfargument type="String" name="instanceName" required=true/>
<cflock type="exclusive" scope="Application" timeout="10" >
<cfif Arguments.instanceName is "All">
<cfset Application._singletons = StructNew() >
<cfelse>
<cfset StructDelete(Application._singletons,arguments.instanceName) >
</cfif>
</cflock>
</cffunction>
</cfcomponent>
Próximo passo é criar normalmente os componentes que serão usados na aplicação, mudando a formação de criação dos objetos, de maneira que utilizem a Singleton.
<cfset cfcA = getInstance("components.ComponentA").init('A') >
<cfset cfcB = getInstance("components.ComponentB").init('B') >
<cfset cfcAA = getInstance("components.ComponentA") >
<cfset cfcAA.any = "AA" >
<cfset cfcBB = getInstance("components.ComponentB") >
<cfset cfcBB.any = "BB" >
<cfset javaObj = getInstance('java.lang.System','java') >
<cfdump var="#cfcA#" label="cfcA">
<cfdump var="#cfcB#" label="cfcB">
<cfdump var="#cfcAA#" label="cfcAA">
<cfdump var="#cfcBB#" label="cfcBB">
<cfdump var="#javaObj#" label="javaObj">
Nota: Os componentes ComponentA e ComponentB, são ilustrativos, você pode utilizar qualquer componente, mas abaixo você pode ver os códigos dos dois componentes.
ComponentA
<cfset this.any = "" >
<cffunction name="init" returntype="ComponentA" output="true" >
<cfargument name="name">
<cfset this.any = arguments.name >
I'm init on ComponentA (arguments.name = #arguments.name#)<br />
<cfreturn this>
</cffunction>
<cffunction name="Foo" returntype="void" >
I'm foo on ComponentA <br />
</cffunction>
</cfcomponent>
ComponentB
<cfset this.any = "" >
<cffunction name="init" returntype="ComponentB" output="true" >
<cfargument name="name">
<cfset this.any = arguments.name >
I'm init on ComponentB (arguments.name = #arguments.name#)<br />
<cfreturn this>
</cffunction>
<cffunction name="Foo" returntype="void" >
I'm foo on ComponentB <br />
</cffunction>
</cfcomponent>
















