Basic implementation:
// :: AbstractFactory :: //
class AbstractFactory{
private var productA:ProductA;
private var productB:ProductB;
private function AbstractFactory(){
}
private function createProductA():Void{
productA = new ProductA();
}
private function createProductB():Void{
productB = new ProductB();
}
}
// :: ConcreteFactory1 :: //
class ConcreteFactory1 extends AbstractFactory{
public function ConcreteFactory1(){
trace(”:: ConcreteFactory1 :: created“);
createProductA();
createProductB();
}
private function createProductA():Void{
super.createProductA();
productA.setSpecificValue(”specificValue1“);
}
private function createProductB():Void{
super.createProductB();
productB.setSpecificValue(”specificValue1“);
}
}
// :: ConcreteFactory2 :: //
class ConcreteFactory2 extends AbstractFactory{
public function ConcreteFactory2(){
trace(”:: ConcreteFactory2 :: created“);
createProductA();
createProductB();
}
private function createProductA():Void{
super.createProductA();
productA.setSpecificValue(”specificValue2“);
}
private function createProductB():Void{
super.createProductB();
productB.setSpecificValue(”specificValue2“);
}
}
// :: ProductA :: //
class ProductA{
private var specificValue:String;
public function setSpecificValue(aSpecificValue:String):Void{
trace(aSpecificValue);
specificValue = aSpecificValue;
}
public function getSpecificValue():String{
return specificValue;
}
}
// :: ProductB :: //
class ProductB{
private var specificValue:String;
public function setSpecificValue(aSpecificValue:String):Void{
trace(aSpecificValue);
specificValue = aSpecificValue;
}
public function getSpecificValue():String{
return specificValue;
}
}
// usage
var factory1:ConcreteFactory1 = new ConcreteFactory1();
trace(”———————————–“);
var factory2:ConcreteFactory2 = new ConcreteFactory2();
// Output:
// :: ConcreteFactory1 :: created
// specificValue1
// specificValue1
// ———————————–
// :: ConcreteFactory2 :: created
// specificValue2
// specificValue2
