建造者模式

一、建造者模式

建造者模式(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版) 刘伟 编著 清华大学出版社

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值