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