Abstract Factory(抽象工厂模式)

来源:互联网 发布:淘宝订单险的作用 编辑:程序博客网 时间:2024/06/10 21:25

Abstract Factory模式的意图是:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

具体到我们迷宫的例子就是: 如果传递一个对象给CreateMaze作参数来创建房间、墙壁和门,那么你可以传递不同的参数来改变房间、墙壁和门的类。这是 Abstract Factory模式的一个例子。

Abstract Factory模式的结构图如下:



• AbstractFactory

— 声明一个创建抽象产品对象的操作接口。
• ConcreteFactory
— 实现创建具体产品对象的操作。
• AbstractProduct
— 为一类产品对象声明一个接口。
• ConcreteProduct
— 定义一个将被相应的具体工厂创建的产品对象。
— 实现AbstractProduct接口。
• Client
— 仅使用由AbstractFactory和AbstractProduct类声明的接口。


适用性:

在以下情况可以使用Abstract Factory模式
• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。


代码实例

我们将使用Abstract Factory模式创建我们在这章开始所讨论的迷宫。类MazeFactory可以创建迷宫的组件。它建造房间、墙壁和房间之间的门。它可以用于一个从文件中读取迷宫说明图并建造相应迷宫的程序。或者它可以被用于一个随机建造迷宫的程序。建造迷宫的程序将 MazeFactory作为一个参数,这样程序员就能指定要创建的房间、墙
壁和门等类。



回想一下建立一个由两个房间和它们之间的门组成的小迷宫的成员函数 CreateMaze。CreateMaze对类名进行硬编码,这使得很难用不同的组件创建迷宫。这里是一个以MazeFactory为参数的新版本的CreateMaze ,它修改了以上缺点




我们创建MazeFactory的子类EnchantedMazeFactory,这是一个创建施了魔法的迷宫的工厂。EnchantedMazeFactory将重定义不同的成员函数并返回Room,Wall等不同的子类。



现在假设我们想生成一个迷宫游戏,在这个游戏里,每个房间中可以有一个炸弹。如果这个炸弹爆炸,它将(至少)毁坏墙壁。我们可以生成一个 Room的子类以明了是否有一个炸弹在房间中以及该炸弹是否爆炸了。我们也将需要一个Wall的子类以明了对墙壁的损坏。我们将称这些类为RoomWithAbomb和BombedWall。我们将定义的最后一个类是 BombedMazeFactory,它是Mazefactory的子类,保证了墙壁是BombedWall类的而房间是RoomWithAbomb的。BombedMazeFactory仅需重定义两个函数:



为建造一个包含炸弹的简单迷宫,我们仅用 BombedMazeFactory调用CreateMaze。


CreateMaze也可以接收一个EnchantedMazeFactory实例来建造施了魔法的迷宫





0 0
原创粉丝点击