AbstractFactory 抽象工厂模式。《设计模式》里面是这样定义的:提供一个创建一系列相关或相互以来对象的接口,而无需指定他们具体的类。
AbstractFactory模式,是一种创建模式,在创建若干个系列的产品时,(但是每一系列构成已经确定不变)时变得容易,它分离了具体的类,有利于产品的一致性。但是若果一个系列的产品若果需要增加,恐怕AbstractFactory模式就难以胜任了,因为改动很多的类。一个应用中一般每一产品系列只需要一个工厂,所以,一个工厂最好用 Singleton来实现。
下面来看一个AS3的例子:
要求显示某种风格的房间,房间里有家具和墙(已经确定),和若干中风格的,现在仅仅支持 中国风格和意大利风格的。
Furniture.as
package {
public class Furniture {
public function Furniture() extends Sprite{
}
public function showFurnitureInfo():void {
throw new Error("Furniture");
}
}
}
ChineseStyleFurniture .as
package {
public class ChineseStyleFurniture extends Furniture {
public function ChineseStyleFurniture() {
}
override public function showFurnitureInfo():void {
trace("I'm ChineseStyleFurniture");
}
}
}
ItalianStyleFurniture .as
package {
public class ItalianStyleFurniture extends Furniture {
public function ItalianStyleFurniture() {
}
override public function showFurnitureInfo():void {
trace("I'm ItalianStyleFurniture");
}
}
}
Wall.as
package {
public class Wall {
public function Wall() {
}
public function showWallInfo():void {
throw new Error("Wall");
}
}
}
ChineseStyleWall.as
package {
public class ChineseStyleWall extends Wall {
public function ChineseStyleWall() {
}
override public function showWallInfo():void {
trace("I'm ChineseStyleWall");
}
}
}
package {
public class ItalianStyleWall extends Wall {
public function ItalianStyleWall() {
}
override public function showWallInfo():void {
trace("I'm ItalianStyleWall");
}
}
}
好了,现在家具和墙的类写完了,若果要增加风格只要在继承Furniture和Wall写相关的风格的具体子类就可以了。下面来写生产具体子类的工厂类。
RoomElementFactory.as
package {
public class RoomElementFactory {
public function RoomElementFactory() {
}
public function createFurniture():Furniture {
return null;
}
public function createWall():Wall {
return null;
}
}
}
ChineseStyleRoomElementFactory.as
package {
public class ChineseStyleRoomElementFactory extends RoomElementFactory {
private static var instance:ChineseStyleRoomElementFactory;
public function ChineseStyleRoomElementFactory() {
}
public static function getInstance():ChineseStyleRoomElementFactory {
if(!instance) {
instance = new ChineseStyleRoomElementFactory();
}
return instance;
}
override public function createFurniture():Furniture {
return new ChineseStyleFurniture();
}
override public function createWall():Wall {
return new ChineseStyleWall();
}
}
}
ItalianStyleRoomElementFactory .as
package {
public class ItalianStyleRoomElementFactory extends RoomElementFactory {
private static var instance:ItalianStyleRoomElementFactory;
public function ItalianStyleRoomElementFactory() {
}
public static function getInstance():ItalianStyleRoomElementFactory {
if(!instance) {
instance = new ItalianStyleRoomElementFactory();
}
return instance;
}
override public function createFurniture():Furniture {
return new ItalianStyleFurniture();
}
override public function createWall():Wall {
return new ItalianStyleWall();
}
}
}
Room类这时,只要操作RoomElementFactory和Furniture和Wall就可以了。
Room .as
package {
public class Room {
public static const CHINESE_STYLE_ROOM:String = "chineseStyleRoom";
public static const ITALIAN_STYLE_ROOM:String = "italianStyleRoom";
public function Room(style:String) {
createRoomElementByStyle(style);
}
private var furniture:Furniture;
private var wall:Wall;
private function createRoomElementByStyle(style:String):void {
if(style == CHINESE_STYLE_ROOM) {
furniture = ChineseStyleRoomElementFactory.getInstance().createFurniture();
wall = ChineseStyleRoomElementFactory.getInstance().createWall();
}
else {
furniture = ItalianStyleRoomElementFactory.getInstance().createFurniture();
wall = ItalianStyleRoomElementFactory.getInstance().createWall();
}
}
public function showElementInfo():void {
if(furniture) {
furniture.showFurnitureInfo();
}
if(wall) {
wall.showWallInfo();
}
}
}
}