建造者模式-游戏角色
- 格式:doc
- 大小:78.50 KB
- 文档页数:8
常见设计模式及应用场景设计模式是一种解决特定问题的经验总结,可以提高代码的可重用性、可读性和灵活性。
在软件开发过程中,常见的设计模式有23种,下面将对其中的几种常见的设计模式及其应用场景进行介绍。
1. 单例模式(Singleton Pattern):单例模式用于限制一个类只能有一个实例,并提供一个全局访问点。
在需要频繁创建和销毁对象的场景下,可以使用单例模式来减少系统开销。
例如,在多线程环境下需要共享某个资源时,通过单例模式可以保证该资源只有一个实例。
2. 工厂模式(Factory Pattern):工厂模式用于创建对象,把实例化对象的过程封装在一个工厂类中。
它解耦了对象的创建和使用,提高了代码的可扩展性。
例如,一个电商平台上有多种类型的商品,可以通过工厂模式根据用户的选择来创建相应类型的商品。
3. 观察者模式(Observer Pattern):观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
观察者模式适用于对象之间存在一种一对多的关系,并且对象之间需要保持一致。
例如,一个新闻发布系统中,当发布一条新闻时,系统需要通知所有订阅该新闻频道的用户。
4. 策略模式(Strategy Pattern):策略模式定义了一系列可以互相替换的算法,并根据具体情况选择合适的算法。
使用策略模式可以避免使用大量的if-else语句,提高代码的可维护性和扩展性。
例如,在一个电商平台中,根据会员等级的不同,可以采用不同的折扣策略来计算商品的价格。
5. 适配器模式(Adapter Pattern):适配器模式用于将两个不兼容的接口转换为可兼容的接口,使得不同的类可以协同工作。
适配器模式可以增强代码的复用性和灵活性。
例如,一个音频播放器只支持mp3格式的音乐文件,当我们需要播放其他格式的音乐文件时,可以使用适配器模式将不同格式的音乐文件转换为mp3格式。
6. 建造者模式(Builder Pattern):建造者模式可以将创建复杂对象的过程与表示分离,使得同样的创建过程可以创建不同的表示。
第1篇一、实验目的本次实验旨在通过实际操作,深入理解建造者模式的设计理念、结构和应用场景。
通过构建一个具体的案例,验证建造者模式在处理复杂对象构建过程中的优势,以及如何实现灵活性和可扩展性。
二、实验环境- 开发工具:Java Development Kit (JDK) 1.8- 编程语言:Java- 案例选择:汽车制造系统三、实验内容本次实验将采用建造者模式设计并实现一个汽车制造系统,其中包含不同类型的汽车(如轿车、SUV、跑车等)及其各个部件的配置。
四、实验步骤1. 定义产品类(Product):- 创建一个抽象的汽车类,定义汽车的基本属性,如品牌、引擎类型、颜色、车轮数量等。
- 为每种类型的汽车创建具体的实现类,如C轿车、SUV车型、跑车等。
2. 定义抽象建造者(Builder):- 创建一个抽象的建造者类,定义构建产品的各个部分的方法,如setBrand()、setEngineType()等。
3. 定义具体建造者(ConcreteBuilder):- 为每种类型的汽车创建具体的建造者类,实现抽象建造者接口,具体确定如何构建产品的各个部分。
4. 定义指挥者(Director):- 创建一个指挥者类,负责调用建造者的方法来构建产品,控制构建顺序和方式。
5. 实现客户端代码:- 在客户端代码中,创建一个指挥者对象,指定要构建的汽车类型和配置。
- 通过指挥者调用相应的建造者方法,构建出最终的汽车产品。
五、实验结果通过以上步骤,成功实现了汽车制造系统。
以下是实验结果的关键点:1. 灵活性和可扩展性:- 通过建造者模式,可以轻松地添加新的汽车类型和配置,只需创建相应的具体建造者类即可。
- 客户端代码无需修改,即可构建新的汽车产品。
2. 封装性和可读性:- 建造者模式将构建过程与产品表示分离,使得代码结构清晰,易于理解和维护。
- 客户端代码只关注产品构建的顺序和方式,无需关心具体的构建细节。
3. 示例代码:```java// 汽车产品类public abstract class Car {protected String brand;protected String engineType;protected String color;protected int wheelNumber;public abstract void setBrand(String brand);public abstract void setEngineType(String engineType);public abstract void setColor(String color);public abstract void setWheelNumber(int wheelNumber); }// 具体轿车产品类public class SedanCar extends Car {@Overridepublic void setBrand(String brand) {this.brand = brand;}@Overridepublic void setEngineType(String engineType) {this.engineType = engineType;}@Overridepublic void setColor(String color) {this.color = color;}@Overridepublic void setWheelNumber(int wheelNumber) {this.wheelNumber = wheelNumber;}}// 建造者接口public interface Builder {void setBrand(String brand);void setEngineType(String engineType);void setColor(String color);void setWheelNumber(int wheelNumber);Car build();}// 具体轿车建造者类public class SedanCarBuilder implements Builder { private Car car;public SedanCarBuilder() {car = new SedanCar();}@Overridepublic void setBrand(String brand) {car.setBrand(brand);}@Overridepublic void setEngineType(String engineType) { car.setEngineType(engineType);}@Overridepublic void setColor(String color) {car.setColor(color);}@Overridepublic void setWheelNumber(int wheelNumber) {car.setWheelNumber(wheelNumber);}@Overridepublic Car build() {return car;}}// 指挥者类public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct(String brand, String engineType, String color, int wheelNumber) {builder.setBrand(brand);builder.setEngineType(engineType);builder.setColor(color);builder.setWheelNumber(wheelNumber);}public Car getCar() {return builder.build();}}// 客户端代码public class Client {public static void main(String[] args) {Builder builder = new SedanCarBuilder();Director director = new Director(builder);director.construct("Toyota", "V6", "Red", 4);Car car = director.getCar();System.out.println("Car brand: " + car.getBrand());System.out.println("Car engine type: " + car.getEngineType());System.out.println("Car color: " + car.getColor());System.out.println("Car wheel number: " + car.getWheelNumber());}}```六、实验总结通过本次实验,我们深入理解了建造者模式的设计理念和应用场景。
作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。
而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2)当构造过程必须允许被构造的对象有不同的表示时。
UML图如下:Builder:定义创建对象过程的抽象,提供构建不同组成部分的接口其中:BuildPartA,BuildPartB,BuildPartC是对一个对象不同部分的构建函数接口,由Builder 的派生类ConcreteBuilder1、ConcreteBuilder2来具体实现.另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.实现:Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA 和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针.以上,通过两个派生类ConcreteBuilder1、ConcreteBuilder2定义了两种不同的建造细节(建造步骤是一样的,由Construct函数确定),通过两个派生类所建造出来的对象,对外部所展现出来的属性或者功能是不一样的,由各自Builder派生类中的建造方法(BuildPartA、BuildPartB、BuildPartC)决定。
如何使用RPGMaker进行角色扮演游戏开发和设计RPGMaker是一款专为角色扮演游戏(RPG)开发和设计的软件工具。
它为游戏爱好者和开发人员提供了一个简便的平台,用于创建自己的RPG游戏。
本文将分为五个章节,介绍如何使用RPGMaker进行角色扮演游戏的开发和设计。
第一章:RPGMaker介绍与安装RPGMaker是一款由Enterbrain公司开发的游戏制作工具。
它提供了一个直观的图形化界面,使开发者可以轻松地创建游戏地图、角色、对话和事件。
首先,我们需要从RPGMaker官方网站上下载并安装软件。
安装完成后,我们可以开始我们的角色扮演游戏的开发之旅。
第二章:创建游戏地图和角色游戏地图是RPG的核心组成部分之一。
在RPGMaker中,我们可以使用图块(tiles)来设计游戏地图。
图块是一种小图像,用于构建地图的各个元素,如地面、墙壁、树木等。
通过拖放图块,我们可以轻松地创建各种场景。
然后,我们可以使用RPGMaker的角色编辑器来设计游戏中的主角、敌人和NPC等角色。
编辑器提供了各种选项,如选择角色的外观、技能和属性等。
第三章:事件的创建与管理在RPGMaker中,事件是游戏中的交互元素。
通过创建事件,我们可以为游戏添加对话、任务、剧情和战斗等元素。
通过事件编辑器,我们可以指定事件的触发条件、行为和效果。
比如,我们可以创建一个NPC事件,当玩家接近NPC时,触发对话,并根据玩家的选择给予奖励或任务。
通过灵活使用事件,我们可以为角色扮演游戏增加更多的内容和深度。
第四章:战斗系统的设计与开发在角色扮演游戏中,战斗系统是至关重要的组成部分。
RPGMaker提供了一个简单但功能强大的战斗系统。
通过战斗编辑器,我们可以定义战斗的规则、技能和效果。
战斗系统是基于回合制的,玩家和敌人交替进行行动。
我们可以设置技能的消耗、伤害和特效等属性。
通过合理设计战斗系统,我们可以提供有趣和挑战性的游戏体验。
第五章:测试与发布游戏在完成角色扮演游戏的开发和设计后,我们需要对游戏进行测试和优化。
建造者模式在项目中的应用一、引言建造者模式是一种创建型设计模式,它允许你分步骤地构造复杂对象。
该模式允许你使用相同的创建代码生成不同类型和形式的对象。
在本文中,将介绍建造者模式在项目中的应用,包括建造者模式的基本概念、优点和缺点,以及如何在项目中实现建造者模式。
二、建造者模式的基本概念1. 建造者:定义了产品的创建过程和最终结果,并提供了一个接口来返回最终创建结果。
2. 具体建造者:实现了建造者接口,并提供了具体的创建方法。
3. 产品:表示被构建的复杂对象。
4. 指挥者:指导具体建造者如何构建产品。
三、建造者模式的优点1. 将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
2. 可以更加精细地控制对象的构建过程,从而可以更好地满足需求。
3. 可以减少重复代码,提高代码复用性。
四、建造者模式的缺点1. 建造者模式需要额外定义多个类,增加了系统复杂度。
2. 对象必须有一个共同的接口,才能使用相同的构建过程。
五、建造者模式在项目中的应用建造者模式在实际项目中有很多应用场景,以下是其中几个典型的应用场景。
1. 安装程序安装程序通常需要进行一系列操作,例如检查系统配置、安装文件、创建快捷方式等。
这些操作可以使用建造者模式来实现。
具体建造者可以是不同类型的安装程序,例如 Windows 安装程序和 Linux 安装程序。
2. 网站生成器网站生成器通常需要根据用户需求生成不同类型和形式的网站。
这些网站可以使用建造者模式来实现。
具体建造者可以是不同类型的网站生成器,例如博客生成器和电商网站生成器。
3. 游戏角色创建在游戏开发中,角色创建通常需要进行一系列操作,例如选择职业、设置属性、选择技能等。
这些操作可以使用建造者模式来实现。
具体建造者可以是不同类型的角色创建器,例如战士创建器和法师创建器。
4. 订单处理订单处理通常需要根据用户需求生成不同类型和形式的订单。
这些订单可以使用建造者模式来实现。
建造者模式的应用例子及其演化过程软件设计模式是软件开发中常用的一种模式化的解决方案。
在软件开发中,常常需要为每个对象进行繁琐的初始化和参数设置工作。
而建造者模式是一种松耦合的解决方案,可以有效减轻开发者的工作负担,提高代码的可阅读性和可维护性。
同时,建造者模式在实现业务逻辑复杂的对象时,可以大幅度降低代码重构的难度。
本文将通过实际案例分析建造者模式的应用范围,以及建造者模式在实际开发中的演化过程。
一、案例分析在实际开发过程中,建造者模式适用于需要构建大量具有相似结构的对象的场景。
下面通过一个实际案例来说明建造者模式的应用。
假设我们正在开发一个游戏,这个游戏需要计算一个英雄角色的属性值。
这个英雄角色有攻击力、防御力、生命值三个属性。
同时,在每个英雄的属性之间会存在一定比例的关系。
比如,攻击力越高,则防御和生命值就可能越低。
因此,在游戏开发中,需要设计一个英雄属性计算器。
这个计算器的功能是,可以根据不同的英雄类型,计算出每个英雄角色的三个属性值。
在这种情况下,我们可以使用建造者模式来实现英雄属性计算器的功能。
具体实现方式如下:1.定义抽象建造者类HeroBuilder,其中包含用于设置英雄属性的方法。
```javapublic abstract class HeroBuilder {protected Hero hero = new Hero();public abstract void buildAttack();public abstract void buildDefense();public abstract void buildHP();public Hero getHero() {return hero;}}```2.定义具体英雄建造者类WarriorBuilder和MageBuilder。
这两个具体建造者分别用于构建战士和法师两种不同类型的英雄。
具体实现方式如下。
```javapublic class WarriorBuilder extends HeroBuilder {public void buildAttack() {hero.setAttack(100);}public void buildDefense() {hero.setDefense(50);}public void buildHP() {hero.setHP(500);}}public class MageBuilder extends HeroBuilder {public void buildAttack() {hero.setAttack(70);}public void buildDefense() {hero.setDefense(30);}public void buildHP() {hero.setHP(300);}}```由于不同类型的英雄之间属性存在比例关系,因此我们可以通过在英雄建造者中添加一些计算逻辑来实现这些比例关系。
建造者模式目录1.建造者模式简介 (2)2.建造者模式解析 (2)2.1什么是建造者模式? (2)2.2详解 (2)3.具体案例造房子 (3)3.1 第一版用户自己去造房子 (3)3.2 第二版工程队去造房子 (3)3.3 第三版由设计师来造房子 (4)4.建造者模式的结构 (5)5.建造者模式应用的场景 (5)6.建造者模式与抽象工厂模式的比较 (5)7.建造者模式总结 (6)1.建造者模式简介将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。
用户不知道内部的具体构建细节。
Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。
2.建造者模式解析2.1什么是建造者模式?Builder模式是一种对象创建型模式,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态创建具有复合属性的对象。
2.2详解Builder是什么?是为了创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder是什么呢?它是具体建造者,实现Builder接口,构造和装配各个部件。
Product当然就是产品角色了,Director是什么?指挥者主要是构建一个Builder接口的对象,用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者的好处就是使的建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品内部的表示,只需要在定义一个具体的建造者就可以了。
3.具体案例造房子类:MainClass(客户端)、House、PingFangBuilder、HouseDicrector方法:makeHouse()接口:HouseBuilder3.1 第一版用户自己去造房子在house里面我用Private定义几个属性。
建造者模式的优势与典型应用案例在软件开发领域中,设计模式是一种通用的解决方案,用于解决常见的问题。
其中,建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示相分离,以便相同的构建过程可以创建不同的表示。
本文将介绍建造者模式的优势和典型应用案例。
一、建造者模式的优势1.1 提供灵活性和可扩展性建造者模式可以将复杂对象的构建过程分解为多个简单的步骤,每个步骤由一个具体的建造者实现。
通过定义不同的建造者实现,可以构建出不同的表示。
这有助于提供灵活性和可扩展性,使得系统能够适应不同的需求变化。
1.2 隐藏复杂对象的创建细节使用建造者模式可以将复杂对象的创建细节隐藏起来,使得客户端不需要知道对象的具体创建过程。
客户端只需要知道如何使用建造者对象,而不需要关心对象的内部实现细节。
这样可以降低系统的耦合度,提高代码的可维护性和可读性。
1.3 代码复用和可读性建造者模式可以将相同的构建过程用于创建不同的表示,从而实现代码的复用。
通过定义不同的建造者实现,可以复用已有的构建过程,减少重复代码的编写。
同时,由于将构建过程拆分为多个步骤,使得代码更加清晰可读,易于理解和维护。
1.4 构建过程逐步完善建造者模式支持逐步完善构建过程,即可以在创建对象的过程中逐步填充对象的属性和方法。
这使得构建过程更加灵活,可以根据实际需求来进行调整和改进。
同时,逐步完善构建过程也有助于提高代码的可测试性,方便进行单元测试和集成测试。
二、建造者模式的典型应用案例2.1 汽车制造业在汽车制造业中,建造者模式可以用于构建不同类型的汽车。
汽车的构建过程可以分解为多个步骤,如组装发动机、安装座椅、喷涂车身等。
通过定义不同的建造者,可以实现不同类型的汽车的构建过程。
例如,可以定义一个轿车建造者和一个SUV建造者,分别用于构建轿车和SUV。
2.2 游戏角色创建在游戏开发中,建造者模式可以用于创建不同类型的游戏角色。
游戏角色的构建过程可以分解为多个步骤,如设置角色属性、选择武器装备、设定技能等。
完整解决方案Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图8-3所示:图7-1 游戏角色创建结构图在图7-1中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者,Actor充当复杂产品。
完整代码如下所示://Actor角色类:复杂产品,考虑到代码的可读性,只列出部分成员属性,且成员属性的类型均为String,真实情况下,有些成员属性的类型需自定义class Actor{private String type; //角色类型private String sex; //性别private String face; //脸型private String costume; //服装private String hairstyle; //发型public void setType(String type) {this.type = type;}public void setSex(String sex) {this.sex = sex;}public void setFace(String face) {this.face = face;}public void setCostume(String costume) {this.costume = costume;}public void setHairstyle(String hairstyle) {this.hairstyle = hairstyle;}public String getType() {return (this.type);}public String getSex() {return (this.sex);}public String getFace() {return (this.face);}public String getCostume() {return (this.costume);}public String getHairstyle() {return (this.hairstyle);}}//角色建造器:抽象建造者abstract class ActorBuilder{protected Actor actor = new Actor();public abstract void buildType();public abstract void buildSex();public abstract void buildFace();public abstract void buildCostume();public abstract void buildHairstyle();//工厂方法,返回一个完整的游戏角色对象public Actor createActor(){return actor;}}//英雄角色建造器:具体建造者class HeroBuilder extends ActorBuilder{public void buildType(){actor.setType("英雄");}public void buildSex(){actor.setSex("男");}public void buildFace(){actor.setFace("英俊");}public void buildCostume(){actor.setCostume("盔甲");}public void buildHairstyle(){actor.setHairstyle("飘逸");}}//天使角色建造器:具体建造者class AngelBuilder extends ActorBuilder {public void buildType(){actor.setType("天使");}public void buildSex(){actor.setSex("女");}public void buildFace(){actor.setFace("漂亮");}public void buildCostume(){actor.setCostume("白裙");}public void buildHairstyle(){actor.setHairstyle("披肩长发");}}//恶魔角色建造器:具体建造者class DevilBuilder extends ActorBuilder {public void buildType(){actor.setType("恶魔");}public void buildSex(){actor.setSex("妖");}public void buildFace(){actor.setFace("丑陋");}public void buildCostume(){actor.setCostume("黑衣");}public void buildHairstyle(){actor.setHairstyle("光头");}}指挥者类ActorController定义了construct()方法,该方法拥有一个抽象建造者ActorBuilder类型的参数,在该方法内部实现了游戏角色对象的逐步构建,代码如下所示://游戏角色创建控制器:指挥者class ActorController{//逐步构建复杂产品对象public Actor construct(ActorBuilder ab){Actor actor;ab.buildType();ab.buildSex();ab.buildFace();ab.buildCostume();ab.buildHairstyle();actor=ab.createActor();return actor;}}为了提高系统的灵活性和可扩展性,我们将具体建造者类的类名存储在配置文件中,并通过工具类XMLUtil来读取配置文件并反射生成对象,XMLUtil类的代码如下所示:import javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXException;import java.io.*;class XMLUtil{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory =DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("config.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.item(0).getFirstChild();String cName=classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c.newInstance();return obj;}catch(Exception e){e.printStackTrace();return null;}}}配置文件config.xml中存储了具体建造者类的类名,代码如下所示:<?xml version="1.0"?><config><className>AngelBuilder</className></config>编写如下客户端测试代码:class Client{public static void main(String args[]){ActorBuilder ab; //针对抽象建造者编程ab = (ActorBuilder)XMLUtil.getBean(); //反射生成具体建造者对象ActorController ac = new ActorController();Actor actor;actor = ac.construct(ab); //通过指挥者创建完整的建造者对象String type = actor.getType();System.out.println(type + "的外观:");System.out.println("性别:" + actor.getSex());System.out.println("面容:" + actor.getFace());System.out.println("服装:" + actor.getCostume());System.out.println("发型:" + actor.getHairstyle());}}编译并运行程序,输出结果如下:天使的外观:性别:女面容:漂亮服装:白裙发型:披肩长发在建造者模式中,客户端只需实例化指挥者类,指挥者类针对抽象建造者编程,客户端根据需要传入具体的建造者类型,指挥者将指导具体建造者一步一步构造一个完整的产品(逐步调用具体建造者的buildX()方法),相同的构造过程可以创建完全不同的产品。
建造者模式的作用和意义建造者模式,这可真是个挺有意思的东西呢。
你有没有搭过积木呀?一块一块小小的积木,在你手里能变成各种各样的东西,可能是一座漂亮的小房子,也可能是一辆酷炫的小汽车。
这就有点像建造者模式的作用呢。
建造者模式就像是一个超级有耐心、超级有创意的积木搭建大师。
它能把那些看起来零零散散的小零件,按照一定的规则和顺序,组合成一个完整的、很棒的大东西。
比如说,你要盖一栋大楼。
这可不是一件简单的事儿啊。
要是没有个好的方法,那可就乱套了。
建造者模式就出现啦,它就像一个智慧的指挥家。
混凝土、钢筋、砖块,这些就好比是建造大楼的原材料,也就是程序里的各个组件。
如果没有建造者模式,就好像一群工人各自为政,拿着材料乱堆一气,最后盖出来的可能就是个歪歪扭扭、随时会倒的怪物建筑。
可是有了建造者模式呢,就不一样啦。
它有条不紊地指挥着,先把地基打好,用钢筋混凝土筑牢根基,就像给大楼穿上了一双结实的鞋子,让它稳稳地站在地上。
然后一层一层地往上砌砖,每一层都按照设计的高度和宽度来,这就像是给大楼穿上了一件合身的衣服,规规矩矩的。
从意义上来说,建造者模式给我们带来了好多方便。
它让整个构建的过程变得清晰起来。
就像我们画画的时候,要是没有一个好的步骤,颜料到处乱涂,最后画出来的东西肯定乱七八糟。
建造者模式就是那个告诉我们先画轮廓,再上颜色,一块一块地把画完善起来的好帮手。
在软件开发中也是这样啊。
它可以让不同的开发人员专注于不同的部分。
就好比盖房子的时候,有的工人专门负责砌墙,有的工人专门负责安装水电。
大家都按照建造者模式这个大计划来,各司其职,效率不就提高了嘛。
再说说定制化这方面。
你去买衣服,有的衣服是那种批量生产的,大家都一样,没什么个性。
但是如果有个设计师按照你的身材、你的喜好,一件一件地给你做衣服呢?这就很特别了。
建造者模式就可以做到这样的定制化。
你想要一个软件有这个功能,不要那个功能,就像你想要衣服上有这个口袋,不要那个装饰一样。
完整解决方案Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图8-3所示:图7-1 游戏角色创建结构图在图7-1中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者,Actor充当复杂产品。
完整代码如下所示://Actor角色类:复杂产品,考虑到代码的可读性,只列出部分成员属性,且成员属性的类型均为String,真实情况下,有些成员属性的类型需自定义class Actor{private String type; //角色类型private String sex; //性别private String face; //脸型private String costume; //服装private String hairstyle; //发型public void setType(String type) {this.type = type;}public void setSex(String sex) {this.sex = sex;}public void setFace(String face) {this.face = face;}public void setCostume(String costume) {this.costume = costume;}public void setHairstyle(String hairstyle) {this.hairstyle = hairstyle;}public String getType() {return (this.type);}public String getSex() {return (this.sex);}public String getFace() {return (this.face);}public String getCostume() {return (this.costume);}public String getHairstyle() {return (this.hairstyle);}}//角色建造器:抽象建造者abstract class ActorBuilder{protected Actor actor = new Actor();public abstract void buildType();public abstract void buildSex();public abstract void buildFace();public abstract void buildCostume();public abstract void buildHairstyle();//工厂方法,返回一个完整的游戏角色对象public Actor createActor(){return actor;}}//英雄角色建造器:具体建造者class HeroBuilder extends ActorBuilder{public void buildType(){actor.setType("英雄");}public void buildSex(){actor.setSex("男");}public void buildFace(){actor.setFace("英俊");}public void buildCostume(){actor.setCostume("盔甲");}public void buildHairstyle(){actor.setHairstyle("飘逸");}}//天使角色建造器:具体建造者class AngelBuilder extends ActorBuilder {public void buildType(){actor.setType("天使");}public void buildSex(){actor.setSex("女");}public void buildFace(){actor.setFace("漂亮");}public void buildCostume(){actor.setCostume("白裙");}public void buildHairstyle(){actor.setHairstyle("披肩长发");}}//恶魔角色建造器:具体建造者class DevilBuilder extends ActorBuilder {public void buildType(){actor.setType("恶魔");}public void buildSex(){actor.setSex("妖");}public void buildFace(){actor.setFace("丑陋");}public void buildCostume(){actor.setCostume("黑衣");}public void buildHairstyle(){actor.setHairstyle("光头");}}指挥者类ActorController定义了construct()方法,该方法拥有一个抽象建造者ActorBuilder类型的参数,在该方法内部实现了游戏角色对象的逐步构建,代码如下所示://游戏角色创建控制器:指挥者class ActorController{//逐步构建复杂产品对象public Actor construct(ActorBuilder ab){Actor actor;ab.buildType();ab.buildSex();ab.buildFace();ab.buildCostume();ab.buildHairstyle();actor=ab.createActor();return actor;}}为了提高系统的灵活性和可扩展性,我们将具体建造者类的类名存储在配置文件中,并通过工具类XMLUtil来读取配置文件并反射生成对象,XMLUtil类的代码如下所示:import javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXException;import java.io.*;class XMLUtil{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory =DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("config.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.item(0).getFirstChild();String cName=classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c.newInstance();return obj;}catch(Exception e){e.printStackTrace();return null;}}}配置文件config.xml中存储了具体建造者类的类名,代码如下所示:<?xml version="1.0"?><config><className>AngelBuilder</className></config>编写如下客户端测试代码:class Client{public static void main(String args[]){ActorBuilder ab; //针对抽象建造者编程ab = (ActorBuilder)XMLUtil.getBean(); //反射生成具体建造者对象ActorController ac = new ActorController();Actor actor;actor = ac.construct(ab); //通过指挥者创建完整的建造者对象String type = actor.getType();System.out.println(type + "的外观:");System.out.println("性别:" + actor.getSex());System.out.println("面容:" + actor.getFace());System.out.println("服装:" + actor.getCostume());System.out.println("发型:" + actor.getHairstyle());}}编译并运行程序,输出结果如下:天使的外观:性别:女面容:漂亮服装:白裙发型:披肩长发在建造者模式中,客户端只需实例化指挥者类,指挥者类针对抽象建造者编程,客户端根据需要传入具体的建造者类型,指挥者将指导具体建造者一步一步构造一个完整的产品(逐步调用具体建造者的buildX()方法),相同的构造过程可以创建完全不同的产品。
在游戏角色实例中,如果需要更换角色,只需要修改配置文件,更换具体角色建造者类即可;如果需要增加新角色,可以增加一个新的具体角色建造者类作为抽象角色建造者的子类,再修改配置文件即可,原有代码无须修改,完全符合“开闭原则”。