ITPub博客

首页 > 数据库 > 数据库开发技术 > 千锋Java课堂 | 通过乐高玩具,带你认识设计模式中的建造者模式

千锋Java课堂 | 通过乐高玩具,带你认识设计模式中的建造者模式

原创 数据库开发技术 作者:Finally_m 时间:2023-03-02 08:03:00 0 删除 编辑
关注Java架构栈,干货天天都不断哦!
前言
本文主要讲述建造者模式,文中会使用通俗易懂的案例,让你更好地学习本章知识点并理解其原理,做到有道无术。
一. 什么是建造者模式
建造者模式是23种设计模式中创建型模式的一种,它关注的是对象创建的步骤,将一个复杂的对象抽象出来,一步步地把一个复杂的对象创建出来。
二. 生活中的建造者模式
1.音乐
提到音乐,江帅比较喜欢周杰伦、陈奕迅的歌,也是听着他们的歌长大的,特别喜欢周董的青花瓷,不仅好听而且词还很美,不知道大家喜欢哪些歌手的歌曲。
每一首动人的歌曲都是通过由一个个美妙的音符组合而成,使用相同音符但是不同循序组合而成的歌曲,也会是不同的歌曲,而这样形成的歌曲就像是设计模式中的建造者模式。


2.国粹
提到国粹,大家能联想到什么呢,江帅第一反应是京剧和麻将。而麻将这个活动,江帅也是很感兴趣的,逢年过节时我都会跟亲戚好友一起打打麻将。麻将的打法不同地区不一样,个数也不一样,但是总归分为那么几类牌,而不同的牌能够组合成不同胡牌的牌型,而通过不同的的麻将子,形成的胡牌牌型就像是设计模式中的建造者模式。


3.LEGO
乐高(LEGO)是知名的老少皆宜的玩具,乐高积木是由一块块的小积木拼接成的一个个成品模型,根据每个人的动手能力和想象力,最终拼出来的成品也会不一样。乐高每年都会举行比赛,每个参赛品都是江帅感觉怎么都拼不出来的艺术品,甚至不同的国家地区都会有各自的乐高比赛举行,而由不同积木组合而成的乐高成品,其实就像是设计模式中的建造者模式。


三. 建造者模式的实现
接下来江帅以一个人型乐高的模型来举例,用建造者模式来实现,我们先来创建一个产品角色乐高类。
package com.qianfeng.ran;

/*
 * @author:江帅
 * 产品角色      
 * 乐高类
 */
public class Lego {
    //头部
    private String head;
    //躯干
    private String body;
    //手部
    private String hand;
    //脚部
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getHand() {
        return hand;
    }

    public void setHand(String hand) {
        this.hand = hand;
    }

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

    @Override
    public String toString() {
        return "Lego{" +
                "head='" + head + '\'' +
                ", body='
" + body + '\'' +
                "
, hand='" + hand + '\'' +
                ", foot='" + foot + '\'' +
                '
}';
    }
}
接下来创建抽象建造者和具体建造者钢铁侠乐高类。
package com.qianfeng.ran;

/**
 * @author:江帅
 * 抽象建造者
 * 建造乐高模型的接口,规定创建人型乐高模型的规范
 */
public interface BuilderLego {
    //创建头部
    void buildHead();
    //创建躯干
    void buildBody();
    //创建手部
    void buildHand();
    //创建脚部
    void buildFoot();

    /**
     * 返回创建的乐高模型
     */
    Lego getLego();
}

/*
 * @author:江帅
 * 具体建造者
 * 钢铁侠乐高
 */
class IronManLego implements BuilderLego {
    private Lego lego;

    public IronManLego() {
        //创建乐高对象
        lego = new Lego();
    }

    @Override
    public Lego getLego() {
        return lego;
    }

    //------------通过规定的方法完成乐高模型的建造------------

    @Override
    public void buildHead() {
        lego.setHand("钢铁头盔(AI系统)");
    }

    @Override
    public void buildBody() {
        lego.setBody("钢铁战衣(集束炮)");
    }

    @Override
    public void buildHand() {
        lego.setHead("钢铁手套(电弧脉冲炮)");
    }

    @Override
    public void buildFoot() {
        lego.setFoot("钢铁战靴(推进器)");
    }
}

/*
 * @author:江帅
 * 具体建造者
 * 高达乐高
 */
class GunDamLego implements BuilderLego{
    private Lego lego;

    public GunDamLego() {
        //创建乐高对象
        lego = new Lego();
    }

    @Override
    public Lego getLego() {
        return lego;
    }

    //------------通过规定的方法完成乐高模型的建造------------

    @Override
    public void buildHead() {
        lego.setHand("高达头部(驾驶舱)");
    }

    @Override
    public void buildBody() {
        lego.setBody("高达躯干(大口径光束加农炮)");
    }

    @Override
    public void buildHand() {
        lego.setHead("高达手部(盾牌)");
    }

    @Override
    public void buildFoot() {
        lego.setFoot("高达腿部(推进器)");
    }
}
再创建一个指挥者乐高的指挥者类。
package com.qianfeng.ran;

/*
 * @author:Ran
 * 指挥者
 * 乐高的指挥者
 */
public class LegoDirector {
    /**
    * 创建乐高对象里的的具体内容
    * @param builderLego
    * @return
    */
    public Lego createLego(BuilderLego builderLego){
        //创建头部
        builderLego.buildHead();
        //创建躯干
        builderLego.buildBody();
        //创建手部
        builderLego.buildHand();
        //创建脚部
        builderLego.buildFoot();
        //返回已构建完毕的乐高对象
        return builderLego.getLego();
    }
}
最后通过建造者模式来创建我们需要的乐高对象。
package com.qianfeng.ran;

/*
 * @author:江帅
 * 客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建管理者
        LegoDirector legoDirector = new LegoDirector();
        //-------创建钢铁侠的乐高模型------
        Lego lego1 = legoDirector.createLego(new IronManLego());
        //执行结果: 
        //Lego{head='钢铁手套(电弧脉冲炮)', body='钢铁战衣(集束炮)', hand='钢铁头盔(AI系统)', foot='钢铁战靴(推进器)'}
        System.out.println(lego1.toString());

        //-------创建高达的乐高模型--------
        Lego lego2 = legoDirector.createLego(new GunDamLego());
        //执行结果:
        //Lego{head='高达手部(盾牌)', body='高达躯干(大口径光束加农炮)', hand='高达头部(驾驶舱)', foot='高达腿部(推进器)'}
        System.out.println(lego2.toString());
    }
}

四. 总结
通过建造者模式创建对象,封装性和扩展性会很好,客户端不需要知道产品内部组成的细节。但是每个产品组成部分必须相同,限制了使用范围,比如想创建个房子的乐高,那组合部分跟钢铁侠和高达都不同就创建不出来了。因此必须是相同的内部组成结构才会选择使用建造者模式。
后续,江帅将带大家学习身外身法之术(设计模式之原型模式)。
点击【阅读原文】,免费开始学习Java视频课程!
- 千锋教育 -

近期课程上新:
Java基础 | Javaweb基础 | Java高级框架 | 微服务架构 | TiDB分布式数据库入门最佳实践 | VUE全面剖析及前后端联动实战 | 23种设计模式 | 企业级项目实战 | Java面试宝典

原文作者:Java架构栈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243797