Java设计模式之LEGO的快乐——建造者模式

2023-06-1709:11:10软件工程与架构Comments1,183 views字数 3183阅读模式

一.什么是建造者模式

建造者模式是23种设计模式中创建型模式的一种,它关注的是对象创建的步骤,将一个复杂的对象抽象出来,一步步地把一个复杂的对象创建出来。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

二.生活中的建造者模式

1.音乐

每一首动人的歌曲都是通过由一个个美妙的音符组合而成,使用相同音符但是不同循序组合而成的歌曲也会是不同的歌曲,而这样形成的歌曲就像是设计模式中的建造者模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

Java设计模式之LEGO的快乐——建造者模式

2.国粹

麻将是中国的国粹。麻将的打法不同地区不一样,个数也不一样,但是总归分为那么几类牌,而不同的牌能够组合成不同的胡牌的牌型,而通过不同的的麻将子形成的胡牌牌型就像是设计模式中的建造者模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

Java设计模式之LEGO的快乐——建造者模式

3.LEGO

乐高(LEGO),知名的老少皆宜的玩具,乐高积木是由一块块的小积木拼接成一个个的成品模型,根据每个人的动手能力和想象力拼出来的成品也会不一样。由不同积木组合而成的乐高成品就像是设计模式中的建造者模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

Java设计模式之LEGO的快乐——建造者模式

三.建造者模式的实现

接下来以一个人型乐高的模型来举例,用建造者模式来实现。先创建一个产品角色乐高类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

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 + ''' +
                '}';
    }
}

接下来创建抽象建造者具体建造者钢铁侠乐高类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

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("高达腿部(推进器)");
    }
}

再创建一个指挥者乐高的指挥者类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

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

最后通过建造者模式来创建我们需要的乐高对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47368.html

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

四.总结

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

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/arc/47368.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定