Java设计模式之Builder模式

Java设计模式之Builder模式

简介

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性

在以下情况使用Build模式:

1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2 当构造过程必须允许被构造的对象有不同的表示时。

3 Builder模式要解决的也正是这样的问题:

  当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),

  我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,

  这样做的好处就是通过一步步的进行复杂对象的构建,

  由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。

用LOL的出装备的顺序为例

lol的uml如下图,人物的四种装备和一个展示装备顺序的show方法,还有client类:

diagram

基本实现代码

BasePerson的实现
public abstract class BasePerson {

    /**
     * 首先出魔法装备
     */
    protected abstract void magic();

    /**
     * 首先出鞋子
     */
    protected abstract void shoe();

    /**
     * 首先出攻速装备
     */
    protected abstract void velocity();

    /**
     * 首先出物理攻击装备
     */
    protected abstract void strength();

    /**
     * 展示出装的顺序
     */
    public abstract void show();
}
DeMaXiYa的实现:
/**
 * @author HaoTianYi  hao.ty@haotianyi.win
 * @version v1.0
 *  表示德玛西亚
 */
public class DeMaXiYa extends BasePerson {

    /**
     * 首先出魔法装备
     */
    protected void magic() {
        System.out.println("-----德玛西亚-----魔法装备-----------");
    }

    /**
     * 首先出鞋子
     */
    protected void shoe() {
        System.out.println("-----德玛西亚-----鞋子-----------");
    }

    /**
     * 首先出攻速装备
     */
    protected void velocity() {
        System.out.println("------德玛西亚----攻速装备-----------");
    }

    /**
     * 首先出物理攻击装备
     */
    protected void strength() {
        System.out.println("-----德玛西亚-----物理攻击装备-----------");
    }

    /**
     * 展示出装的顺序
     */
    @Override
    public void show() {
        magic();
        shoe();
        velocity();
        strength();
    }
}
QiTianDaSheng的基本实现
/**
 * @author HaoTianYi  hao.ty@haotianyi.win
 * @version v1.0
 * 表示猴子
 */
public class QiTianDaSehng extends BasePerson {

    /**
     * 首先出魔法装备
     */
    protected void magic() {
        System.out.println("----猴子------魔法装备-----------");
    }

    /**
     * 首先出鞋子
     */
    protected void shoe() {
        System.out.println("----猴子------鞋子-----------");
    }

    /**
     * 首先出攻速装备
     */
    protected void velocity() {
        System.out.println("----猴子------攻速装备-----------");
    }

    /**
     * 首先出物理攻击装备
     */
    protected void strength() {
        System.out.println("----猴子------物理攻击装备-----------");
    }

    /**
     * 展示出装的顺序
     */
    @Override
    public void show() {
        magic();
        shoe();
        velocity();
        strength();
    }
}
client的实现:
 public class client {
    public static void main(String[] args) {
        DeMaXiYa deMaXiYa = new DeMaXiYa();
        deMaXiYa.show();

        QiTianDaSehng qiTianDaSehng = new QiTianDaSehng();
        qiTianDaSehng.show();
    }
}

最后的出装备的结果:

sp161128_175127

初步使用Buildr模式

上面的代码不复杂,但是“将一个复杂对象的构建与它的表示没有分离”,两个任务由构建方法和表示方法,使用Builder将一个复杂对象的构建与它的表示分离。

diagram2

做到了将一个复杂对象的构建与它的表示分离

BasePerson的改进
public abstract class BasePerson {

    /**
     * 首先出魔法装备
     */
    public abstract void magic();

    /**
     * 首先出鞋子
     */
    public abstract void shoe();

    /**
     * 首先出攻速装备
     */
    public abstract void velocity();

    /**
     * 首先出物理攻击装备
     */
    public abstract void strength();
}
Builder的实现
public abstract class Builder {
    /**
     * 表示与之对应的英雄
     */
    protected BasePerson mBasePerson;

    /**
     * 设置出装的顺序和展示
     */
    public abstract void setOrderAndShow();

    /**
     * 获得英雄人物
     *
     * @return
     */
    public abstract Builder setPerson();
}
两个具体Builder的实现
public class DeMaBuilder extends Builder {

    /**
     * 设置出装的顺序和展示
     */
    @Override
    public void setOrderAndShow() {
        mBasePerson.magic();
        mBasePerson.shoe();
        mBasePerson.velocity();
        mBasePerson.strength();
    }

    /**
     * 获得英雄人物
     *
     * @return
     */
    @Override
    public Builder setPerson() {
        mBasePerson = new DeMaXiYa();
        return this;
    }
}
public class HouZiBuilder extends Builder {

    /**
     * 设置出装的顺序和展示
     */
    @Override
    public void setOrderAndShow() {
        mBasePerson.magic();
        mBasePerson.shoe();
        mBasePerson.velocity();
        mBasePerson.strength();
    }

    /**
     * 获得英雄人物
     *
     * @return
     */
    @Override
    public Builder setPerson() {
        mBasePerson = new QiTianDaSehng();
        return this;
    }
}

除了类名不同,初始化不同其他完全相同

client的改进
public class client {
    public static void main(String[] args) {

        DeMaBuilder deMaBuilder = new DeMaBuilder();
        deMaBuilder.setPerson().setOrderAndShow();

        HouZiBuilder houZiBuilder = new HouZiBuilder();
        houZiBuilder.setPerson().setOrderAndShow();
    }
}

完整的Builder模式

增加导演类,再次包装builder类:

diagram3

Director的实现

public abstract class Director {
    protected Builder mBuilder;

    /**
     * 调用builder中的方法
     */
    public abstract void construct();
}
public class DeMaDirector extends Director {

    public DeMaDirector() {
        mBuilder = new DeMaBuilder();
    }

    /**
     * 调用builder中的方法
     */
    @Override
    public void construct() {
        mBuilder.setPerson().setOrderAndShow();
    }
}
public class HouZiDirector extends Director {

    public HouZiDirector() {
        mBuilder = new HouZiBuilder();
    }

    /**
     * 调用builder中的方法
     */
    @Override
    public void construct() {
        mBuilder.setPerson().setOrderAndShow();
    }
}

client的改进

public class client {
    public static void main(String[] args) {
        new DeMaDirector().construct();
        new HouZiDirector().construct();
    }
}

GitHub连接:GitHub

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java设计模式是一种在软件开发中常用的决问题的方法论,它提供了一套经过验证的解决方案,可以帮助开发人员更好地组织和设计代码。在面试中,Java设计模式通常是一个重要的考察点。下面是一些常见的Java设计模式及其简要介绍: 1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。 2. 工厂模式(Factory Pattern):通过工厂类创建对象,隐藏对象的创建逻辑。 3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 4. 建造者模式Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 5. 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,避免了使用new关键字创建对象。 6. 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。 7. 装饰器模式(Decorator Pattern):动态地给一个添加额外的职责,同时又不改变其结构8. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 9. 观察者模式(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象状态改变时,其所有依赖者都会收到通知并自动更新。 10. 策略模式(Strategy Pattern):定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值