<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Richard Lord &#187; Factory</title>
	<atom:link href="http://www.richardlord.net/blog/tag/factory/feed" rel="self" type="application/rss+xml" />
	<link>http://www.richardlord.net</link>
	<description>Actionscript/Flex, PHP and Java developer</description>
	<lastBuildDate>Fri, 25 Jun 2010 07:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Singleton Factory</title>
		<link>http://www.richardlord.net/blog/singleton-factory</link>
		<comments>http://www.richardlord.net/blog/singleton-factory#comments</comments>
		<pubDate>Fri, 27 Jul 2007 12:55:11 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Best practice]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[Free code]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://www.bigroom.co.uk/blog/singleton-factory/</guid>
		<description><![CDATA[<p>I've mentioned before how I <a href="/blog/better-without-singletons/">dislike the Singleton pattern</a>... So this morning I was experimenting with various other possible ways to create singletons in Actionscript 3 and came up with a function that can be used to create and reuse a single instance of any class. I don't know how useful it will turn out to be but here it is. It's also a useful example of a package level function...</p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve mentioned before how I <a href="/blog/better-without-singletons">dislike the Singleton pattern</a>. One of my issues is encapsulating the single instance nature of the pattern within the class, when most often the requirement for only one instance is not a feature of the class but a feature of the application that is using the class.</p>

<p>So this morning I was experimenting with various other possible ways to create singletons in Actionscript 3 and came up with a function that can be used to create and reuse a single instance of any class. I don&#8217;t know how useful it will turn out to be but here it is. It&#8217;s also a useful example of a package level function.</p>

<pre class="code">package
{
    function Singleton( c:Class ):*
    {
        for( var i:String in instances )
        {
            if( instances[i].constructor === c )
            {
                return instances[i];
            }
        }
        var obj:* = new c();
        instances.push( obj );
        return obj;
    }
}
var instances:Array = new Array();</pre>

<p>You can use this function to create an instance of any class (your own or an intrinsic class) as follows (for example):</p>

<pre class="code">import flash.geom.Point;
var a:Point = Singleton( Point );</pre>

<p>if you request another point elsewhere in your project, for example</p>

<pre class="code">import flash.geom.Point;
var b:Point = Singleton( Point );</pre>

<p>you will get the same point back again.</p>

<p>The one problem is the need to loop through all previously created singletons looking for a match before creating a new one. The more singletons you create, the slower this will be. It&#8217;s probably fine since most applications only use a few singletons but it would be great to get a unique identifier directly from the class and then look up the matching singleton directly. I can get the class name via the toString method, but would also need the full package to ensure uniqueness. Any ideas?</p>

<p>Like I said, I&#8217;m not sure how useful this function will be but it&#8217;s here if anyone wants to use it. If you improve it then please let me know.</p>

<h3>Postscript</h3>

<p>In the comments below, Benny suggested a way to remove the loop, and so gain a more stable lookup time, by using a Dictionary instead of an Array. His suggestion, with minor alterations by me, looks like this.</p>

<pre class="code">package
{
   function Singleton( c:Class ):*
   {
      return c in instances ? instances[c] : instances[c] = new c();
   }
}
import flash.utils.Dictionary;
var instances:Dictionary = new Dictionary( false );</pre>

<p>Thanks, Benny.</p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlord.net/blog/singleton-factory/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
