Фабрика

Код:
class Factory
/*
Factory class
example:
//create factory object for class myClass
// myClass.id - unique identifier of myClass instances
var myFactory = Factory.getFactoryFor('myClass', 'id');
//create myClass object
var myObject = myFactory.create(123);
// myObject is now instance of myClass
// myObject.id == 123
var myObject1 = myFactory.create(123);
// myObject1 is alias of myObject
// myObject1.id == myObject.id == 123
var myObject2 = myFactory.create(321);
// myObject2.id = 321
// myObject2 != myObject1
*/
{
var className:String;
var idName:String;
var cache:Array;
static var selfCache:Array;
private function Factory(className:String, idName:String)
{
this.className = className;
this.idName = idName;
this.cache = new Array;
};
public static function getFactoryFor(className:String, idName:String)
{
if(!selfCache[className])
{
if(!selfCache) selfCache = new Array;
selfCache[className] = new Factory(className, idName);
if(!selfCache[className]) trace('ERROR: can not create Factory');
}
return selfCache[className];
}
private function safeNew(className)
{
var obj = new [className]; // create object
if(!obj) trace("ERROR: can not instantiate '"+className+"' object"); // error
return obj;
}
public function create(initData)
{
var obj:Object;
if(this.idName) // id field specified
{// use cache
if(this.cache[initData[this.idName]]) // found in cache
{ // return cached object
return this.cache[initData[this.idName]];
}
else
{ // create instance
this.cache[initData[this.idName]] = this.safeNew(this.className); // save in cache
};
obj = this.cache[initData[this.idName]];
}
else // id field not specified
{ // no cache
obj = this.safeNew(this.className);
};
var foo:String; // iterator
for(foo in initData)
{
obj[foo] = initData[foo]; // assign property
};
return obj;
}
}