`

AbstractFactory 抽象工厂

阅读更多

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

  

 

 

 

 

  • 大小: 60 KB
  • 大小: 133.4 KB
分享到:
评论
1 楼 ibio 2009-05-06  
引用
   好了,现在家具和墙的类写完了,若果要增加风格只要在继承Furniture和Wall写相关的风格的具体子类就可以了。下面来写生产具体子类的工厂类。

增加了相关的风格不是一样也要修改 Room 类里面的这个吗?
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();
			}
		}

相关推荐

    李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    **抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一,它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。这种类型的设计模式属于类的创建模式。** 在C#中,抽象工厂模式的核心在于抽象...

    C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    1. **抽象工厂接口(Abstract Factory)**:定义一个创建对象的接口,但不指定具体的实现。在C#中,这通常表现为一个接口,如`IAbstractFactory`。 2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,...

    C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) (Level 300)

    1. **抽象工厂(Abstract Factory)**:定义一个创建对象的接口,但不指定具体的实现。在C#中,这通常表现为一个接口,如`IAbstractFactory`。 2. **具体工厂(Concrete Factory)**:实现了抽象工厂接口,负责创建...

    Abstract_Factory抽象工厂

    Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂

    20051115pm--C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    抽象工厂模式(Abstract Factory)是一种创建型设计模式,用于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式的关键在于,它允许客户端代码与具体的实现细节解耦,使得添加新的产品...

    抽象工厂AbstractFactory

    抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式是基于对象的抽象,而不是具体的类,因此,它允许创建一系列相关的对象,而无需指定...

    走进设计模式之抽象工厂(Abstract Factory)

    1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...

    抽象工厂模式abstractFactory

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象集合的接口,而无需指定具体的产品类型。这种模式适用于当系统需要在不同平台或环境中创建一组相关或相互依赖的对象时,而这些...

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...

    C# 抽象工厂 AbstractFactory.rar

    这个压缩包“C# 抽象工厂 AbstractFactory.rar”可能包含了一个关于如何在C#中实现抽象工厂模式的实例或教程。 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方式,而无需指定具体类。在C#中,这种...

    AbstractFactory.rar抽象工厂

    在“AbstractFactory.rar”这个压缩包中,我们可以预想包含了一个简单的示例,用来演示抽象工厂模式的基本概念和应用。 抽象工厂模式的核心在于“工厂”,在软件工程中,工厂是负责创建对象的类或接口。在这个具体...

    设计模式C++学习之抽象工厂模式(AbstractFactory)

    在这个例子中,`AbstractProductA`和`AbstractProductB`是抽象产品,`ConcreteProductA1/A2`和`ConcreteProductB1/B2`是具体产品,`AbstractFactory`是抽象工厂,`ConcreteFactory1/2`是具体工厂。客户端代码通过...

    抽象工厂模式(Abstract factory)

    1. **抽象工厂接口(Abstract Factory)**:定义了一系列产品的创建方法,例如`NWFactory`可能是这个抽象工厂的实现,它包含了创建人和动物的方法。 2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,...

    创建型-抽象工厂模式(Abstract Factory)

    1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...

    抽象工厂模式(Abstract Factory Pattern)

    ### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    通过python实现抽象工厂模式(Abstract Factory Pattern).rar

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...

    工厂方法和抽象工厂——Factory Method & Abstract Factory

    在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...

Global site tag (gtag.js) - Google Analytics