but using Composition and a Singleton arent mutually exclusive. Composition is a very broad style of OO architecture, used widely throughout a lot of patterns.

You *might* call his example a Singleton Factory, but that probably confuses the issue as its not creating multiple instances of a concrete subclass, just creating one instance at runtime depending on particular external factors.

I think his example is a good one, it keeps the dependency on locale knowledge safely contained in one place, and as Spike says, if you start moving up to 20 or so locales to support, you arent going to want to have a massive switch / if else statement everytime you want some locale dependent currency formatting.

all the client code ever needs to do is ask the CurrencyFormatter for its instance and for that instance to format the number.


martin

JesterXL wrote:
As the coffee kicks in, that also looks like Composition, not Singleton. Like, you have a Singleton class instantiating instances and returning them of other classes from within itself.

----- Original Message ----- From: "JesterXL" <[EMAIL PROTECTED]>
To: "Flashcoders mailing list" <flashcoders@chattyfig.figleaf.com>
Sent: Saturday, October 29, 2005 10:19 AM
Subject: Re: [Flashcoders] Newbie AS3 question


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
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders


--
want to know what i think? probably not

http://relivethefuture.com/choronzon
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to