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(); } } } }