首页 > 编程语言 >Java建造者模式,用代码体验LEGO的快乐

Java建造者模式,用代码体验LEGO的快乐

时间:2023-06-05 14:44:06浏览次数:40  
标签:Java String LEGO void Lego public lego 体验 乐高

前言

本文主要讲述Java设计模式中的建造者模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是建造者模式

建造者模式是23种设计模式中创建型模式的一种,它关注的是对象创建的步骤,将一个复杂的对象抽象出来,一步步地把一个复杂的对象创建出来。

二.生活中的建造者模式

1.音乐

每一首动人的歌曲都是通过由一个个美妙的音符组合而成,使用相同音符但是不同循序组合而成的歌曲也会是不同的歌曲,而这样形成的歌曲就像是设计模式中的建造者模式。

image.png

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());
    }
}

四.总结

通过建造者模式创建对象,封装性和扩展性会很好,客户端不需要知道产品内部组成的细节。但是每个产品组成部分必须相同,限制了使用范围,比如想创建个房子的乐高,那组合部分跟钢铁侠和高达都不同就创建不出来了。因此必须是相同的内部组成结构才会选择使用建造者模式。

下一章将带大家学习身外身法之术(设计模式之原型模式)。


以上就是我们本篇的全部内容啦,本期以LEGO为例,为大家讲解了Java设计模式中的建造者模式,不知道大家是否学会了呢~

编程并不枯燥,如果有技术类问题,欢迎大家和我们一起交流讨论!

标签:Java,String,LEGO,void,Lego,public,lego,体验,乐高
From: https://www.cnblogs.com/qian-fen/p/17457733.html

相关文章

  • 浏览器请求转换成Postman和postman请求转Java/JS.等后端代码
     unirest为例:<!--与postman非常友好的RPC框架--><dependency><groupId>com.konghq</groupId><artifactId>unirest-java</artifactId><version>3.5.00</version></depend......
  • Java集合List转树结构工具类-函数版
    工具类:packagecom.example.mindsa.util.tree;importcom.baomidou.mybatisplus.core.toolkit.support.SFunction;importlombok.SneakyThrows;importjava.lang.invoke.SerializedLambda;importjava.lang.reflect.Method;importjava.util.List;importjava.util.func......
  • Java反射获取不到注解
    在CGlib动态代理的情况下method.getAnnotation(PostMapping.class);这样是获取不到注解的.需要用Spring自带的工具类来获取:AnnotationUtils.findAnnotation(method,PostMapping.class);......
  • Java模拟表单提交编码不同导致乱码问题解决
    最近有个业务需要模拟表单提交到asp页面中,但是我的项目编码是UTF8,而asp页面是GB2312,中文字段提交后,到达数据库后是乱码.问题的解决在于模拟提交的时候指定编码:我用的HTTP框架是Unirest,代码如下:......
  • java 图形学 点和闭合区域位置关系判断
    判断一个点是否在一个特定的区域内或外,通常需要你具备区域的数学表达(例如,方程、不等式等)以及要判断的点的坐标。例如,如果你有一个圆的方程(x-h)²+(y-k)²=r²,其中(h,k)是圆心,r是半径,你要判断点(a,b)是否在此圆内或外。你可以将点(a,b)的坐标带入这个方程:如果(a......
  • JavaScript 递归的简单例子
     typescript+vue3functionflattenTree(tree:any,result:any){tree.forEach((node:any)=>{result.push({id:node.id,cat_name:node.cat_name,cat_name_en:node.cat_name_en});if(node.child.length>0){flattenTree(node.child,r......
  • Java的先行发生原则
    先行发生原则(Happens-Before)是Java内存模型定义的一个等效判断原则。依赖这个原则,我们可以通过几条简单规则判断数据是否存在竞争,线程是否安全,而不需要陷入Java内存模型苦涩难懂的定义之中。“先行发生”原则指的是什么。比如说操作A先行发生于操作B,其实就是说在操作B发生......
  • java 内存模型
    java内存模型(memorymodel)定义了java虚拟机如何与计算机内存交互。JVM将内存主要分为栈(stack)内存和堆(heap)内存。每当我们声明新的变量和对象、调用新的方法、声明String或执行类似的操作时,JVM都会从堆栈内存或堆空间为这些操作指定内存。每个线程有自己的栈内存,是线程独有的。堆......
  • java 自己写分页
    longcurrent=1;longsize=100;StringcurrentOther=jsonObject.getStr("current");if(StrUtil.isNotBlank(currentOther)){//?:0或1个,*:0或多个,+:1或多个BooleanstrResult1=currentOther.matches("^[-\\+]?([0-9]+\\.?)?[0-9]+$");if......
  • Java中Double除保留后小数位的几种方法
     返回double型的1.能四舍五入doubled=114.145;d=(double)Math.round(d*100)/100;System.out.println(d); 2.BigDecimal.ROUND_HALF_UP表示四舍五入,BigDecimal.ROUND_HALF_DOWN也是五舍六入,BigDecimal.ROUND_UP表示进位处理(就是直接加1),BigDecimal.ROUND_DOWN表示直接......