实战设计模式系列-AbstractFactory(抽象工厂)

【需求分析】

 

    假设我们需要写一个迷宫游戏,游戏支持用户自由选择游戏的场景,比如可以选择普通的迷宫,或者是有魔法的迷宫等。但所有的迷宫都有一些共同的元素,包括墙壁、门、房间。

 

    只考虑创造一个普通的迷宫,代码比较简单,如下所示:

 

 

 

    为了让迷宫支持更多的差异化,我们把迷宫的属性进行细分,可以发现不同的迷宫间有共同的元素,不同的只是元素的属性,或者说元素的实现方式。因此,我们希望这些共同的元素能够被工厂动态的生产出来,然后加入到迷宫当中,如下所示:

 

   

    factory是一个工厂,这个工厂可以是一个生产普通迷宫的工厂,或者是生产魔法迷宫的工厂,他们都能生产出同样的迷宫,而只是样式不同。这样就实现了迷宫的动态创建

 

【实现过程】

1. 实现迷宫的组件抽象类

    抽象这些元素的共同点,都有enter接口,因此可以给这些组件定义一个抽象类MapSite,如下所示:

 

2.实现迷宫的组件

 

    现在假设要支持两种迷宫,魔法迷宫和可墙壁可爆炸的迷宫。我们先定义房间。

 

    类似的实现墙壁和门。

 

 

 

3.实现工厂

 

    工厂必须能生产门,墙和房间,因此这些应该是基类的抽象接口。

 

 

4.实现迷宫类

 

 

 

5.如何使用

 

 

【总结】

 

    抽象工厂在抽象工厂类中定义接口,子类中实现父类的方法,不同的配置方式就有多个子类去实现,而客户只使用父类中提供的接口,通过传参数的方式在客户类中决定用那个具体的工厂去实例化对象。

    下图是本文中举例的图示,图中MazeFactory作为父类限定了接口,可以是抽象类,也可是具体类,如是具体类,则可以定义一个最基本的功能接口,并可以在ClientMazeGame中初实例化。

    客户类MazeGame接收一个MazeFactory引用参数来实例化一个产品,通过传入具体类的参数在运行时刻决定应该实例化那一个类。

    RoomWall作为组件使用来构建具体的工厂类。

    这个模式的缺点在于难以支持新种类的产品,每增加一个新的功能就要修改抽象工厂类的接口。

    抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值