<?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>Eamonn Faherty &#187; design patterns</title>
	<atom:link href="http://blog.eamonnfaherty.co.uk/tag/design-patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.eamonnfaherty.co.uk</link>
	<description>technology enthusiast and public speaker</description>
	<lastBuildDate>Tue, 21 Jun 2011 10:14:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Actionscript3 Design Patterns:Factory Method</title>
		<link>http://blog.eamonnfaherty.co.uk/2009/11/17/actionscript3-design-patternsfactory-method/</link>
		<comments>http://blog.eamonnfaherty.co.uk/2009/11/17/actionscript3-design-patternsfactory-method/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 21:55:46 +0000</pubDate>
		<dc:creator>eamonn</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[design patterns]]></category>

		<guid isPermaLink="false">http://blog.eamonnfaherty.co.uk/?p=250</guid>
		<description><![CDATA[Background Reading The creation method pattern The Problem? You want to use objects that are created else where and are of a set type but the implementations may vary. Examples? SocketManager, or any thing that needs to be replace during unit testing. How? The constructor of my complex object: public class CharacterFactory { public static var factory : NonPlayerCharacterFactory; public static function getAPlayer() : IPlayer { return factory.getAButton(); } } The using of the creation method: var player:IPlayer = CharacterFactory. getAPlayer(); Why is it good? ‚Ä¢ It is easy to understand; it is a simple pattern that needs little extraRead more


No related posts.

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Background Reading<br />
The creation method pattern</p>
<p>The Problem?<br />
You want to use objects that are created else where and are of a set type but the implementations may vary. </p>
<p>Examples?<br />
SocketManager, or any thing that needs to be replace during unit testing.</p>
<p>How?<br />
The constructor of my complex object:</p>
<pre class=‚Äùbrush:as3‚Äù>
public class CharacterFactory {

	public static var factory : NonPlayerCharacterFactory;

	public static function getAPlayer() : IPlayer {
		return factory.getAButton();
	}
}
</pre>
<p>The using of the creation method:</p>
<pre class=‚Äùbrush:as3‚Äù>
var player:IPlayer = CharacterFactory. getAPlayer();
</pre>
<p>Why is it good?<br />
‚Ä¢	It is easy to understand; it is a simple pattern that needs little extra code.  It builds on the singleton pattern, which is well known.<br />
‚Ä¢	You can get objects without knowing how they are created or where they come from.<br />
‚Ä¢	You can share objects without the users of the factory knowing the objects are shared.</p>
<p>Why is it bad?<br />
‚Ä¢	It is confusing to read code where objects are not being created directly.<br />
‚Ä¢	Debugging is hard, as you have to know what was in the factory when you used it in order to know what object you have.</p>
<p>Further Reading<br />
Read about the IOC pattern. </p>
<p>More<br />
Factories are great! They allow you to define scope for your application.  This means that you can set a testing scope when you are running unit tests.  The involves setting the factories used in your factory to a test factory which provides test doubles.  Changing the scope of the factories outside of your application means that you test your code without making any special changes.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.eamonnfaherty.co.uk/2009/11/17/actionscript3-design-patternsfactory-method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript3 Design Patterns:Creation Method</title>
		<link>http://blog.eamonnfaherty.co.uk/2009/11/11/actionscript3-design-patternscreation-method/</link>
		<comments>http://blog.eamonnfaherty.co.uk/2009/11/11/actionscript3-design-patternscreation-method/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 20:17:35 +0000</pubDate>
		<dc:creator>eamonn</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[creation method]]></category>
		<category><![CDATA[design patterns]]></category>

		<guid isPermaLink="false">http://blog.eamonnfaherty.co.uk/?p=242</guid>
		<description><![CDATA[Background Reading The factory method pattern The Problem? You have a complex object, which has a lot of arguments in its constructor or you always want to construct the object using different sets of parameters. Examples? Socket Manager How? The constructor of my complex object: public function ComplicatedButton(colour:uint, mouseOverColour:uint, mouseOutColour:uint) { _mouseOverColour = mouseOverColour; _mouseOutColour = mouseOutColour; setUpGraphics(colour); addEventListeners(); } The using of the creation method: var redButton : ComplicatedButton = ComplicatedButton.getRedButton(); var blueButton : ComplicatedButton = ComplicatedButton.getBlueButton(); Why is it good? ‚Ä¢ It is easy to understand; it is a simple pattern that needs little extra code. It buildsRead more


No related posts.

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><strong>Background Reading</strong><br />
The factory method pattern</p>
<p><strong>The Problem?</strong><br />
You have a complex object, which has a lot of arguments in its constructor or you always want to construct the object using different sets of parameters.</p>
<p><strong>Examples?</strong><br />
Socket Manager</p>
<p><strong>How?</strong><br />
The constructor of my complex object:</p>
<pre class=‚Äùbrush:as3‚Äù>
public function ComplicatedButton(colour:uint, mouseOverColour:uint, mouseOutColour:uint) {
	_mouseOverColour = mouseOverColour;
	_mouseOutColour = mouseOutColour;
	setUpGraphics(colour);
addEventListeners();
}
</pre>
<p>The using of the creation method:</p>
<pre class=‚Äùbrush:as3‚Äù>
var redButton : ComplicatedButton = ComplicatedButton.getRedButton();
var blueButton : ComplicatedButton = ComplicatedButton.getBlueButton();
</pre>
<p><strong>Why is it good?</strong><br />
‚Ä¢	It is easy to understand; it is a simple pattern that needs little extra code.  It builds on the singleton pattern, which is well known.<br />
‚Ä¢	Anyone using one of the creation methods to create the object is guaranteed to have an object in an identical state as the other users of the method.<br />
‚Ä¢	Objects that complicated or a lot of constructor parameters can be simplified.</p>
<p><strong>Why is it bad?</strong><br />
‚Ä¢	The class now has two responsibilities, the main purpose of the class plus the instantiation of its instances.<br />
‚Ä¢	The class can often grow in size as the creators in declared inside the class.  This makes the class harder to read for a developer.</p>
<p><strong>Further Reading</strong><br />
Read about the factory patterns. </p>
<p><strong>More</strong><br />
Creation methods are a great first move towards using factories.  Their concept is easy to grasp and doesn‚Äôt require much extra code.  The class can grow quite big, quite quickly but it is up to you to spot when the acceptable size has been passed for you to put your refactoring hat on.  I would use them when I have a graphical component that accepts integer colours as parameters or when I have components that need a lot of initial set up.  In the example above I have colours specified as integers.  To ensure that all of the buttons considered to be red or blue are the same shades of red or blue I protect users of my ComplicatedButton by adding creation methods with the colours hard coded.  Once I have more than one group of setups I would refactor, replacing the creation method with a factory method.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.eamonnfaherty.co.uk/2009/11/11/actionscript3-design-patternscreation-method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript3 Design Patterns:The Multiton</title>
		<link>http://blog.eamonnfaherty.co.uk/2009/11/10/actionscript3-design-patternsthe-multiton/</link>
		<comments>http://blog.eamonnfaherty.co.uk/2009/11/10/actionscript3-design-patternsthe-multiton/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 22:27:37 +0000</pubDate>
		<dc:creator>eamonn</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[multiton]]></category>

		<guid isPermaLink="false">http://blog.eamonnfaherty.co.uk/?p=238</guid>
		<description><![CDATA[Background Reading Read about the singleton The Problem? You want to have multiple instances of a singleton and want global access to them all. This may be because the objects use groups of resources, such as different groups of sounds, or because the objects need a lot of configuration, such as currency converters, or need global access, an event dispatcher. Examples? Currency converter, sound controller, global event dispatcher How? The Multiton: public class SocketManagerMultiton { private static var _instaces : Dictionary; public static const CHAT : String = "CHAT"; public static const WEATHER : String = "WEATHER"; public static functionRead more


No related posts.

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><strong>Background Reading</strong><br />
Read about the singleton</p>
<p><strong>The Problem?</strong><br />
You want to have multiple instances of a singleton and want global access to them all.  This may be because the objects use groups of resources, such as different groups of sounds, or because the objects need a lot of configuration, such as currency converters, or need global access, an event dispatcher.</p>
<p><strong>Examples?</strong><br />
Currency converter, sound controller, global event dispatcher</p>
<p><strong>How?</strong><br />
The Multiton:</p>
<pre class="brush:as3">
public class SocketManagerMultiton {
	private static var _instaces : Dictionary;
	public static const CHAT : String = "CHAT";
	public static const WEATHER : String = "WEATHER";

	public static function getInstace(instance:String) : SocketManagerMultiton {
	ensureInstanceExists(instance);
		return _instaces[instance];
	}

private static function ensureInstanceExists(instance:String) : void {
		if (_instaces == null) {
			_instaces = new Dictionary();
		}
		if (_instaces[instance] == null) {
			_instaces[instance] = new SocketManagerMultiton();
		}
	}

	public function send(message : String) : void {
	}
}
</pre>
<p><strong>Example Use:</strong></p>
<pre class="brush:as3">
var chatSocket : SocketManagerMultiton = SocketManagerMultiton.getInstace(SocketManagerMultiton.CHAT);
chatSocket.send("hello world");

var weatherSocket : SocketManagerMultiton = SocketManagerMultiton.getInstace(SocketManagerMultiton.WEATHER);
weatherSocket.send("HOW_IS_THE_WEATHER");
</pre>
<p><strong>Why is it good?</strong><br />
‚Ä¢	It is easy to understand; it is a simple pattern that needs little extra code.  It builds on the singleton pattern, which is well known.<br />
‚Ä¢	See singleton pattern for other good points.</p>
<p><strong>Why is it bad?</strong><br />
‚Ä¢	It tightly couples the classes that use the multiton to the fact that they are using a multiton.<br />
‚Ä¢	See singleton pattern for other bad points.</p>
<p><strong>Further Reading</strong><br />
Read about the factory and inversion of control patterns. </p>
<p><strong>More</strong><br />
Multitons are a way of grouping Singletons.  They share the benefits and carry the problems that Singletons have.  They are good for classes that use a lot of resources such as socket connections or classes that cache things.  They do make code harder to refactor and very difficult to unit test but if follow the suggestions I made in the Singleton post then you can limit your pain, a bit anyway!  If you are going to use a multiton make sure you use String constants as I did above.  It is easy to make typing mistakes when using String literals.  Also the constants can be meaningful, as they are in my example.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.eamonnfaherty.co.uk/2009/11/10/actionscript3-design-patternsthe-multiton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript3 Design Patterns:The Singleton</title>
		<link>http://blog.eamonnfaherty.co.uk/2009/11/09/actionscript3-design-patternsthe-singleton/</link>
		<comments>http://blog.eamonnfaherty.co.uk/2009/11/09/actionscript3-design-patternsthe-singleton/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 00:25:33 +0000</pubDate>
		<dc:creator>eamonn</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://blog.eamonnfaherty.co.uk/?p=234</guid>
		<description><![CDATA[Background Reading None The Problem? You want to ensure you have only a single instance of an object and want global access to it. This may be because the object uses a resource, such as sounds, or because the object needs a lot of configuration, such as a currency formatter, or needs global access, an event dispatcher. Examples? Currency formatter, sound controller, global event dispatcher How? The Singleton: package singletonpattern { /** * @author eamonn faherty */ public class SocketManagerSingleton { private static var _instace : SocketManagerSingleton; public static function getInstace() : SocketManagerSingleton { ensureInstanceExists(); return _instace; } private staticRead more


No related posts.

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><strong>Background Reading</strong><br />
None</p>
<p><strong>The Problem?</strong><br />
You want to ensure you have only a single instance of an object and want global access to it.  This may be because the object uses a resource, such as sounds,  or because the object needs a lot of configuration, such as a currency formatter, or needs global access, an event dispatcher.</p>
<p><strong>Examples?</strong><br />
Currency formatter, sound controller, global event dispatcher</p>
<p><strong>How?</strong><br />
The Singleton:</p>
<pre class="brush:as3">package singletonpattern {

	/**
	 * @author eamonn faherty
	 */
	public class SocketManagerSingleton {
		private static var _instace : SocketManagerSingleton;

		public static function getInstace() : SocketManagerSingleton {
			ensureInstanceExists();
			return _instace;
		}

		private static function ensureInstanceExists() : void {
			if (_instace == null) {
				_instace = new SocketManagerSingleton();
			}
		}

		public function send(message : String) : void {
		}
	}
}</pre>
<p>Example Usage:</p>
<pre class="brush:as3">
package singletonpattern {
	import common.Example;		

	/**
	 * @author eamonn faherty
	 */
	public class SingletonPatternExample extends Example {

		public function SingletonPatternExample() {
			var socket : SocketManagerSingleton = SocketManagerSingleton.getInstace();

			socket.send("Hello world");
		}
	}
}</pre>
<p><strong>Why is it good?</strong><br />
‚Ä¢	It works well; if you use an instance protector then you can be sure that only a single instance will exist.<br />
‚Ä¢	It is well understood; it is widely used in the actionscript world.<br />
‚Ä¢	It is easy to understand; it is a simple pattern that needs little extra code.<br />
‚Ä¢	It is easy to implement; actionscript allows us to check the caller of a method and allows us to use private classes.</p>
<p><strong>Why is it bad?</strong><br />
‚Ä¢	It tightly couples the classes that use the singleton to the fact that they are using a singleton.<br />
‚Ä¢	It is not possible to extend the singleton class if you wanted to add functionality.<br />
‚Ä¢	You cannot use your singleton class again; you cannot extend it or reuse it with composition.<br />
‚Ä¢	If you are unit testing a class that uses a singleton you need to add some code to your singleton to make testing possible.</p>
<p><strong>Further Reading</strong><br />
Read about the factory and inversion of control patterns.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.eamonnfaherty.co.uk/2009/11/09/actionscript3-design-patternsthe-singleton/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Design Patterns for Actionscript 3</title>
		<link>http://blog.eamonnfaherty.co.uk/2009/10/31/design-patterns-for-actionscript-3/</link>
		<comments>http://blog.eamonnfaherty.co.uk/2009/10/31/design-patterns-for-actionscript-3/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 23:34:27 +0000</pubDate>
		<dc:creator>eamonn</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[lfpug]]></category>

		<guid isPermaLink="false">http://blog.eamonnfaherty.co.uk/?p=227</guid>
		<description><![CDATA[I recently did my first public talk! It was at LFPUG (London Flash Platform UserGroup). Here are the details I think it went really well. I had some very kind feedback via email and twitter and also on the night in person! A few people have requested that I upload the examples I used and the slides so here they are. Over the next few weeks I am going to be posting example patterns with more information, in more depth than I did on the night. If you want me to cover a pattern please post a comment with theRead more


No related posts.

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>I recently did my first public talk! It was at LFPUG (London Flash Platform UserGroup).</p>
<p><a href="http://www.lfpug.com/29th-october-2009-29102009/">Here are the details</a></p>
<p>I think it went really well. I had some very kind feedback via email and twitter and also on the night in person!</p>
<p>A few people have requested that I upload the examples I used and the slides so here they are.</p>
<p>Over the next few weeks I am going to be posting example patterns with more information, in more depth than I did on the night.</p>
<p>If you want me to cover a pattern please post a comment with the pattern name and I will bump it up in the list.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.eamonnfaherty.co.uk/2009/10/31/design-patterns-for-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

