一、建造者模式
建造者模式(Builder Pattern)是一种对象创建型模式。
定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
使用频率:2星
建造者模式结构图:
优点:
1、封装性好,构建和表示分离。
2、扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
3、客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点:
1、产品的组成部分必须相同,这限制了其使用范围。
2、如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
应用场景:
1、相同的方法,不同的执行顺序,产生不同的结果。
2、多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
3、产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。
二、建造者模式实例之游戏人物角色
1.实例说明
某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、技能等特征有所差异,使用建造者模式创建人物角色对象,要求绘制类图并编程实现。
2.实例类图
3.实例代码
本例中,ActorController充当指挥者,ActorBuilder充当抽象建造者,VampireBuilder、WerewolfBuilder和WitchBuilder充当具体建造者,Actor充当复合产品。
//Actor角色类:复合产品
class Actor {
private String type;
private String sex;
private String skill;
//Getter and Setter: 略
}
//角色建造器:抽象建造者
abstract class ActorBuilder {
protected Actor actor = new Actor();
public abstract void buildType();
public abstract void buildSex();
public abstract void buildSkill();
public Actor createActor(){
return actor;
}
}
//吸血鬼建造器:具体建造者
class VampireBuilder extends ActorBuilder{
@Override
public void buildType() {
actor.setType("吸血鬼");
}
@Override
public void buildSex() {
actor.setSex("男");
}
@Override
public void buildSkill() {
actor.setSkill("吸血");
}
}
//狼人建造器:具体建造者
class WerewolfBuilder extends ActorBuilder{
@Override
public void buildType() {
actor.setType("狼人");
}
@Override
public void buildSex() {
actor.setSex("男");
}
@Override
public void buildSkill() {
actor.setSkill("撕咬");
}
}
//女巫建造器:具体建造者
class WitchBuilder extends ActorBuilder{
@Override
public void buildType() {
actor.setType("女巫");
}
@Override
public void buildSex() {
actor.setSex("女");
}
@Override
public void buildSkill() {
actor.setSkill("魔法");
}
}
/
//Actor角色创建控制器:指挥者
class ActorController {
public Actor construct(ActorBuilder ab){
Actor actor;
ab.buildType();
ab.buildSex();
ab.buildSkill();
actor = ab.createActor();
return actor;
}
}
客户端测试代码:
class Client {
public static void main(String[] args) {
ActorController ac = new ActorController();
ActorBuilder ab = new VampireBuilder();
Actor vampire = ac.construct(ab);
System.out.println(vampire.getType()+"的游戏设定:");
System.out.println("性别:"+vampire.getSex());
System.out.println("技能:"+vampire.getSkill());
System.out.println("---------------------------");
ActorBuilder ab2 = new WerewolfBuilder();
Actor werewolf = ac.construct(ab2);
System.out.println(werewolf.getType()+"的游戏设定:");
System.out.println("性别:"+werewolf.getSex());
System.out.println("技能:"+werewolf.getSkill());
System.out.println("---------------------------");
ActorBuilder ab3 = new WitchBuilder();
Actor witch = ac.construct(ab3);
System.out.println(witch.getType()+"的游戏设定:");
System.out.println("性别:"+witch.getSex());
System.out.println("技能:"+witch.getSkill());
System.out.println("---------------------------");
}
}
运行结果:
吸血鬼的游戏设定:
性别:男
技能:吸血
---------------------------
狼人的游戏设定:
性别:男
技能:撕咬
---------------------------
女巫的游戏设定:
性别:女
技能:魔法
---------------------------
在建造者模式中,客户端只需要实例化指挥者类即可,指挥者类针对抽象建造者编程,根据传入的具体建造者对象类型,具体建造者一步步构造出完整的产品。相同的构造过程可以创建不同的角色。为了提供系统可扩展性,可将具体建造者类类名存储在配置文件中。
三、建造者模式和工厂模式的区别
1、建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
2、创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
3、关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成。
4、建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。
参考文献
【1】建造者模式(Bulider模式)详解
【2】设计模式实训教程(第2版) 刘伟 编著 清华大学出版社