AbstractFactory 抽象工厂

本文介绍抽象工厂模式的概念及其在AS3中的应用实例。通过创建不同风格的房间元素,展示如何利用抽象工厂模式来分离具体类并保持产品一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值