Yep, That's another valid way to achieve the same result for that case. Like I said, there are often alternatives to using the singleton pattern.
A couple more points about singletons. If you start out with the singleton you can switch easily from singleton to non-singleton at a later stage without affecting any code that uses your singleton. You just have to change the singleton class so that every call to getInstance() creates a new instance rather than returning the shared one. Modifying the static approach is a lot more work because you have to go find every single place in your code where the static method is called and replace it with some code that uses an instance. Another, less well known, factor is what happens when a sub-class overrides a static method. I don't know about ActionScript, but in Java you can get odd side effects. Take the code below. Most java developers would expect the output to be "Hello from Test2". It isn't. It's "Hello from Test". Like I said, I have no idea what the benaviour is in ActionScript, but that's a nasty gotcha in Java. I also feel that the static method approach isn't really a very OO way of doing things. In object oriented programming, you want everything to be an object that you can pass around and keep nicely encapsulated. The static approach feels more like procedural code for some reason. Java Code ******************************** public class Test { public static String getMessage(){ return getString(); } protected static String getString(){ return "Hello from Test"; } } public class Test2 extends Test { protected static String getString(){ return "Hello from Test2"; } } public class Main { public static void main(String[] args) { System.out.println(Test2.getMessage()); } } **************************** On 10/29/05, JesterXL <[EMAIL PROTECTED]> wrote: > > It does a little. Why can't can't you just extend the base > CurrencyFormatter class and do the same thing for the formatValue > function? > Rather than return the correct one for getInstance(), just utilize the > particular format class you want? > > Like, do: > > var val = UKCurrencyFormatter.getFormat(); > > and: > > var val = USCurrencyFormatter.getFormat(); > > ? > > ----- Original Message ----- > From: "Spike" <[EMAIL PROTECTED]> > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > Sent: Friday, October 28, 2005 10:31 PM > Subject: Re: [Flashcoders] Newbie AS3 question > > > Sure, > > Here's a slightly more complete implementation of that last example: > > > public class CurrencyFormatter { > > private static formatter:CurrencyFormatter; > > public function getInstance():CurrencyFormatter { > // use ExternalInterface or IP lookup or whatever to determine locale > if (locale == "UK") { > formatter = new UKCurrencyFormatter(); > } else { > formatter = new USCurrencyFormatter(); > } > return formatter; > } > > class USCurrencyFormatter extends CurrencyFormatter { > > public formatValue(val:Number) { > // very simplistic formatting > return "$" + String(val); > } > } > > class UKCurrencyFormatter extends CurrencyFormatter { > > public formatValue(val:Number) { > // very simplistic formatting > return "£" + String(val); > } > } > > } > > Let me know if that explains it a bit better. > > Spike > > > On 10/29/05, JesterXL <[EMAIL PROTECTED]> wrote: > > > > Can you elaborate? Why wouldn't the static class work in that case? > > > > ----- Original Message ----- > > From: "Spike" <[EMAIL PROTECTED]> > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > Sent: Friday, October 28, 2005 9:54 PM > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > ok, > > > > That's just a static class. > > > > Like I said, there's a subtle but important difference between singleton > > and > > a static class. > > > > Here's another example. > > > > You have a requirement to provide a currency formatter. > > > > One way to do this is to create a singleton that returns a different > > currency formatter depending on which locale you are in. > > > > So in the class you would have something like this (Omitting method > > declarations for simplicty): > > > > public class CurrencyFormatter { > > > > class USCurrencyFormatter extends CurrencyFormatter { > > > > } > > > > > > class UKCurrencyFormatter extends CurrencyFormatter { > > > > } > > } > > > > Now if I call CurrencyFormatter.getInstance() it gives me the correct > > formatter for my locale. > > > > With your static class approach you have to check in every method what > the > > locale is and handle it accordingly. That's fine for one or two locales, > > but > > if you want to handle 20, it gets pretty ugly. > > > > You can solve the problem in other ways of course, but it does > demonstrate > > the difference between static classes and the singleton pattern. The > > singleton pattern offers you a lot more possibilities. > > > > Spike > > > > On 10/29/05, JesterXL <[EMAIL PROTECTED]> wrote: > > > > > > To clarify: > > > > > > > > > class ServerConnection > > > { > > > private static var url; > > > private static var port; > > > private static var socket; > > > > > > public static function connect(p_url, p_port) > > > { > > > url = p_url; > > > port = p_port; > > > socket = new Socket(); > > > socket.connect(url, port); > > > } > > > > > > public static function getData() > > > { > > > // Simple function that gets something from the server. > > > } > > > } > > > > > > Then to use: > > > > > > ServerConnection.connect(myURL, myPort); > > > > > > ----- Original Message ----- > > > From: "JesterXL" <[EMAIL PROTECTED]> > > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > > Sent: Friday, October 28, 2005 9:25 PM > > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > > > > Naw, I don't know the exact way Singleton is implemented, hence my > long > > > battle with finding clarification. It could of been solved in 10 > seconds > > > over a beer, but email sux. > > > > > > I figured Math.abs was the Singleton pattern, and ARP, me, Sho, Steven > > > Webster, and everyone else apparently has their own version of > > Controller > > > as > > > well. I figured I knew enough to use it. > > > > > > For instance, your example makes perfect sense and I can see why you'd > > > want > > > to do it that way. I, on the other hand would just put an if then > > > statement > > > in the connect method or whatever to ensure we're connected before > > making > > > a > > > method call, else throw an exception. > > > > > > Are they both the Singleton pattern? Does it matter? > > > > > > > > > ----- Original Message ----- > > > From: "Spike" <[EMAIL PROTECTED]> > > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > > Sent: Friday, October 28, 2005 7:14 PM > > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > > > > Hmmm.... > > > > > > >From your explanation, I think either I don't understand what happens > > in > > > >AS, > > > or you're misunderstanding the use of the singleton pattern. > > > > > > In an attempt to understand better, here's an example of where I would > > use > > > the singleton pattern. > > > > > > I have a requirement to talk to a socket on a server, but I need to > make > > > sure that I only ever have a single connection from each user. > > > > > > So... > > > > > > I create a ServerConnection class that has something like this > (ignoring > > > private constructors etc.): > > > > > > ServerConnection { > > > > > > private static instance:ServerConnection; > > > > > > static function getInstance() { > > > if (this.instance == null) { > > > instance = new ServerConnection(url,port); > > > } else { > > > // make sure that the port and url for the instance match the passed > url > > > and > > > port. > > > // if not, barf an error > > > } > > > return instance; > > > } > > > > > > public function getData() { > > > // Simple function that gets something from the server. > > > } > > > } > > > > > > ok, so I have now guaranteed that I will only ever create a single > > > connection to the server because I'm always getting the same object > back > > > regardless of how many times I call getInstance() in my code. > > > > > > So I can happily do this anywhere I like in my code: > > > > > > ServerConnection.getInstance().getData() > > > > > > If I had something like what you have in the Math class, the getData() > > > method would have to be declared as static and it would have to check > > > every > > > time you called it to see if there was an active connnection to the > > > server. > > > If not it would have to create one and you would have to hope that 2 > > > method > > > calls didn't step on each other and create multiple server > connections. > > > > > > Not sure if that clarifies or confuses, but hopefully you can let me > > know > > > if > > > and how it differs in Flash. > > > > > > Spike > > > > > > On 10/28/05, JesterXL <[EMAIL PROTECTED]> wrote: > > > > > > > > ActionScript 2, no, no difference. You actually have to do a tincy > bit > > > of > > > > extra work to get AS2 to support getInstance like I've seen it in > > Java. > > > > > > > > This all goes way in AS3 since prototype is strictly in the hands of > > > > flash.util.Proxy; basically, prototype is now read-only, and Proxy > is > > > the > > > > only one who can wriggle around the rules in the new AVM. > > > > > > > > That's the one thing that always pissed me off about Cairngorm, and > I > > > > debated for days on the ARP Advisory list till I was overulled > merely > > by > > > > strength of numbers of opposing viewpoints. > > > > > > > > First, to clarify, when I speak of Singleton.getInstance(), I speak > of > > > the > > > > only way to utilize the Singleton's methods, so yes, if you want to > > call > > > > it > > > > calling a method on an instance, that's fine, but it's still spoken > of > > > as > > > > a > > > > Singleton only has 1 instance. > > > > > > > > That being the case, what I used to like to do was, even from AS1: > > > > > > > > class MyClass > > > > { > > > > public static function sup() > > > > { > > > > trace("yo"); > > > > } > > > > } > > > > > > > > Which boils down to: > > > > > > > > function MyClass() > > > > { > > > > } > > > > > > > > MyClass.sup = function() > > > > { > > > > trace("yo"); > > > > }; > > > > > > > > Therefore, allowing this: > > > > > > > > MyClass.sup(); > > > > > > > > Since Functions are objects in ActionScript 1 & 2, and about the > same > > in > > > > 3. > > > > > > > > However, when talking about why EventDispatcher in Cairngorm, and > > > > Controller > > > > in ARP both have the getInstance method, I was told that it was to > > > ensure > > > > that there was only ever 1 instance of it. > > > > > > > > I replied that there is; it's already defined, use it. Math.abs() > > works > > > > just fine, you don't do Math.getInstance().abs(), so why should I > have > > > to > > > > do > > > > that extra function when I know there is only 1 instance, and it's > > > static, > > > > and ready to go? > > > > > > > > Fast-forward 4 days, class based vs. protoytpe languages, and > > > demographics > > > > exploration later, and I see their point; if you don't understand > how > > > > ActionScript is written, doing things like Math.random() really > > doesn't > > > > make > > > > any sense to traditional programmers, and having to know that much > > about > > > > how > > > > a language works is really unfair, doesn't make people want to dive > in > > > > without it being familiar & comfortable, and is an elitist stance. > > > > > > > > So, although I think getIstance() isn't technically needed (in AS1 > or > > > > AS2), > > > > I still see the need for it, and respect it from a traditional > > developer > > > > standpoint. > > > > > > > > ----- Original Message ----- > > > > From: "Spike" <[EMAIL PROTECTED]> > > > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > > > Sent: Friday, October 28, 2005 6:38 PM > > > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > > > > > > > *snip* > > > > AS3 and Flex both hammer the point that this really has little use > > other > > > > than confirming for those programmers who are not familiar with > > > > ActionScript. Same goes for the Singleton.method vs. > > > > Singleton.getInstance().method argument; the latter is for those > > > > programmers > > > > who don't know ActionScript well. > > > > *snip* > > > > > > > > Maybe there's something I don't understand, or maybe you typed it > > wrong, > > > > but > > > > in every other OO language I've dealt with there's a significant but > > > > subtle > > > > difference between > > > > > > > > Singleton.getInstance().method() > > > > > > > > and > > > > > > > > Singleton.method() > > > > > > > > The former is calling an instance method and the latter is calling a > > > > static > > > > method. > > > > > > > > Instance methods have access to instance data that is persisted as > > long > > > as > > > > the instance exists, static methods have access only to static data > > and > > > > that > > > > data passed in to the method call. > > > > > > > > Is this not true in ActionScript? > > > > > > > > Spike > > > > > > > > On 10/28/05, JesterXL <[EMAIL PROTECTED]> wrote: > > > > > > > > > > I'm the opposite end of the spectrum. This: > > > > > > > > > > class Box extends UIObject > > > > > { > > > > > function doStuff() > > > > > { > > > > > move(x + 10, y + 10); > > > > > setSize(width + 100, height + 100); > > > > > visible = !visible; > > > > > } > > > > > } > > > > > > > > > > looks more readable to me than: > > > > > > > > > > class Box extends UIObject > > > > > { > > > > > function doStuff() > > > > > { > > > > > this.move(this.x + 10, this.y + 10); > > > > > this.setSize(this.width + 100, this.height + 100); > > > > > this.visible = !this.visible; > > > > > } > > > > > } > > > > > > > > > > To each their own. I can see it justified in extending intrinsic > > > > classes, > > > > > as the first parameter to setInterval, and the first parameter in > > > > > Delegate. > > > > > > > > > > AS3 and Flex both hammer the point that this really has little use > > > other > > > > > than confirming for those programmers who are not familiar with > > > > > ActionScript. Same goes for the Singleton.method vs. > > > > > Singleton.getInstance().method argument; the latter is for those > > > > > programmers > > > > > who don't know ActionScript well. > > > > > > > > > > If you do it every day, there is no point. > > > > > > > > > > ----- Original Message ----- > > > > > From: "Muzak" <[EMAIL PROTECTED]> > > > > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > > > > Sent: Friday, October 28, 2005 5:37 PM > > > > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > > > > > > > > > > Well, to me it's the other way around. > > > > > Code that doesn't use proper references looks messy to me. > > > > > > > > > > Whe I'm lazy or in a hurry, I do skip them, but I usually find > > myself > > > > > adding > > > > > them afterwards anyway. > > > > > > > > > > So, I'm with ryanm on this one ;-) > > > > > > > > > > regards, > > > > > Muzak > > > > > > > > > > ----- Original Message ----- > > > > > From: "Martin Wood" <[EMAIL PROTECTED]> > > > > > To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com> > > > > > Sent: Friday, October 28, 2005 11:03 PM > > > > > Subject: Re: [Flashcoders] Newbie AS3 question > > > > > > > > > > > > > > > > > > > > > > > > > > > > ryanm wrote: > > > > > >>> What I don't get is why it needs "this.addChild" instead of > just > > > > > >>> addChild. I've been sick of the keyword "this" for a long time > > > > > >>> and have since avoided it in AS2. > > > > > >>> > > > > > >>> Any reason that it needs to be back in for AS3? > > > > > >>> > > > > > >> Maybe because it's one of the most useful scope references ever > > > > > >> invented? > > > > > >> > > > > > >> The fundamental concept that you seem to miss is that > "addChild" > > is > > > > > >> meaningless by itself, it is a method of an object (in > > > > > >> proper OOP development), and if you just say "addChild", who is > > > > adding > > > > > >> the child? > > > > > > > > > > > > the context is the current class. Occasionally 'this' is useful > if > > > you > > > > > > happen to name a method parameter or local variable the > > > > > > same as a member variable and need to distinguish the two. > > > > > > > > > > > > But, I dont agree that its bad form to leave it out, nor is it > any > > > > more > > > > > > difficult to maintain. > > > > > > > > > > > > in my opinion putting 'this' in everywhere to me just makes > things > > > > > harder > > > > > > to read. > > > > > > > > > > > > thanks, > > > > > > > > > > > > Martin > > > > > > > > > > > > > > > _______________________________________________ > > > > > Flashcoders mailing list > > > > > Flashcoders@chattyfig.figleaf.com > > > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > > > > > _______________________________________________ > > > > > Flashcoders mailing list > > > > > Flashcoders@chattyfig.figleaf.com > > > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > > > > > > > > > > > > > > > > -- > > > > -------------------------------------------- > > > > Stephen Milligan > > > > Do you do the Badger? > > > > http://www.yellowbadger.com > > > > > > > > Do you cfeclipse? http://www.cfeclipse.org > > > > _______________________________________________ > > > > Flashcoders mailing list > > > > Flashcoders@chattyfig.figleaf.com > > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > > > _______________________________________________ > > > > Flashcoders mailing list > > > > Flashcoders@chattyfig.figleaf.com > > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > > > > > > > > > > > -- > > > -------------------------------------------- > > > Stephen Milligan > > > Do you do the Badger? > > > http://www.yellowbadger.com > > > > > > Do you cfeclipse? http://www.cfeclipse.org > > > _______________________________________________ > > > Flashcoders mailing list > > > Flashcoders@chattyfig.figleaf.com > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > _______________________________________________ > > > Flashcoders mailing list > > > Flashcoders@chattyfig.figleaf.com > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > _______________________________________________ > > > Flashcoders mailing list > > > Flashcoders@chattyfig.figleaf.com > > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > > > > > > -- > > -------------------------------------------- > > Stephen Milligan > > Do you do the Badger? > > http://www.yellowbadger.com > > > > Do you cfeclipse? http://www.cfeclipse.org > > _______________________________________________ > > Flashcoders mailing list > > Flashcoders@chattyfig.figleaf.com > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > _______________________________________________ > > Flashcoders mailing list > > Flashcoders@chattyfig.figleaf.com > > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > > > > > -- > -------------------------------------------- > Stephen Milligan > Do you do the Badger? > http://www.yellowbadger.com > > Do you cfeclipse? http://www.cfeclipse.org > _______________________________________________ > Flashcoders mailing list > Flashcoders@chattyfig.figleaf.com > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > > _______________________________________________ > Flashcoders mailing list > Flashcoders@chattyfig.figleaf.com > http://chattyfig.figleaf.com/mailman/listinfo/flashcoders > -- -------------------------------------------- Stephen Milligan Do you do the Badger? http://www.yellowbadger.com Do you cfeclipse? http://www.cfeclipse.org _______________________________________________ Flashcoders mailing list Flashcoders@chattyfig.figleaf.com http://chattyfig.figleaf.com/mailman/listinfo/flashcoders