美文网首页
设计模式:5-建造者模式:Builder

设计模式:5-建造者模式:Builder

作者: 大栗几 | 来源:发表于2020-05-21 12:57 被阅读0次

文章来源本人的博客:http://codelifeliwan.github.io/ 转载请注明出处
查看[设计模式]系列内容请点击:https://www.jianshu.com/nb/45937362

定义:(Builder)

将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示,对象的构建即对象内部的参数设置过程,对象的表示即实际得到的对象,平时的编程一般使用的是直接创建一个对象然后手工去设置各个参数,而建造者模式使用了建造者来设置参数,用户不需要关心参数设置

可以进行如下理解:(以建楼为例)

1、房地产开发商(是一个人)要建两栋不一样的大楼,他知道楼该建成什么样却连砖都搬不动

2、农民工知道怎么建每一个元素却不知道楼该建成什么样

3、开发商对农民工A说楼1长成什么什么样子,对农民工B也说了楼2长什么样子

4、农民工A建好楼1的每个元素,开发商自己把这些东西根据需要组装成一栋楼(农民工不组装哦,只把窗子建好了扔那,事实上农民工是造零件的,也是实际建造者,开发商是组装者),B也同样

5、开发商自己组装好后卖给客户

图示说明:(具体示例见代码)

图片3

代码

package com.codelifeliwan.builder;
 
/**
 * 传说中的大楼的角色,这里只是规定了通用属性
 * */
public abstract class Computer {
    private String type; // 计算机型号
    private String ram; // 计算机内存大小
    private String os; // 计算机安装的操作系统
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getRam() {
        return ram;
    }
 
    public void setRam(String ram) {
        this.ram = ram;
    }
 
    public String getOs() {
        return os;
    }
 
    public void setOs(String os) {
        this.os = os;
    }
}
 
 
package com.codelifeliwan.builder;
 
/**
 * <p>
 * 传说中的农民工的通用技能接口说明,规定了是农民工就必须得会这些技能
 * </p>
 * 
 * 计算机的建造者规范接口,包括: <br>
 * 1、建造各种计算机零件<br>
 * 2、返回给用户一个计算机,至于计算机怎么建造的还是得指导者来指导
 * */
public interface ComputerBuilder {
 
    public void buildType();
 
    public void buildRam();
 
    public void buildOs();
 
    public void buildGraphicCard();
 
    public void buildColor();
 
    // 返回计算机,至于造出来的计算机是什么样,还得根据指导者调用上面方法的情况来看
    public Computer getResult();
}
 
 
package com.codelifeliwan.builder;
 
/**
 * 传说中的具体大楼2的角色,规定了需要有哪些东西
 * */
public class DellComputer extends Computer {
    private String color;
 
    public String getColor() {
        return color;
    }
 
    public void setColor(String color) {
        this.color = color;
    }
 
    @Override
    public String toString() {
        return "type:" + this.getType() + "\n\rram:" + this.getRam()
                + "\n\ros:" + this.getOs() + "\n\rcolor:" + this.getColor();
    }
}
 
 
package com.codelifeliwan.builder;
 
/**
 * 传说中的具体大楼1的角色,规定了需要有哪些东西
 * */
public class HPComputer extends Computer {
    private String graphicCard;
 
    public String getGraphicCard() {
        return graphicCard;
    }
 
    public void setGraphicCard(String graphicCard) {
        this.graphicCard = graphicCard;
    }
 
    @Override
    public String toString() {
        return "type:" + this.getType() + "\n\rram:" + this.getRam()
                + "\n\ros:" + this.getOs() + "\n\rgraphic card:"
                + this.getGraphicCard();
    }
}
 
 
package com.codelifeliwan.builder;
 
/**
 * 传说中的农民工B
 * */
public class DellComputerBuilder implements ComputerBuilder {
 
    private DellComputer computer = new DellComputer();// 农民工需要建造的大楼
 
    // 下面几个都是建造的过程
    @Override
    public void buildType() {
        computer.setType("Dell computer");
    }
 
    @Override
    public void buildRam() {
        computer.setRam("2GB");
    }
 
    @Override
    public void buildOs() {
        computer.setOs("Microsoft Windows 7 professional");
    }
 
    @Override
    public void buildGraphicCard() {
        // 不自带显卡,不建造
    }
 
    @Override
    public void buildColor() {
    }
 
    @Override
    public Computer getResult() {
        return this.computer;
    }
 
}
 
 
package com.codelifeliwan.builder;
 
/**
 * 传说中的农民工A
 * */
public class HPComputerBuilder implements ComputerBuilder {
 
    private HPComputer computer = new HPComputer();
 
    // 下面几个都是建造的过程
    @Override
    public void buildType() {
        computer.setType("HP compac 511");
    }
 
    @Override
    public void buildRam() {
        computer.setRam("1GB");
    }
 
    @Override
    public void buildOs() {
        computer.setOs("RedFlag Linux 6 desktop");
    }
 
    @Override
    public void buildGraphicCard() {
        computer.setGraphicCard("ATI");
    }
 
    @Override
    public void buildColor() {
        // 没有颜色属性,不建造
    }
 
    @Override
    public Computer getResult() {
        return this.computer;
    }
 
}
 
 
package com.codelifeliwan.builder;
 
public class ComputerDirector {
    ComputerBuilder builder;
 
    // build huipu
    public HPComputer buildHP() {
        builder = new HPComputerBuilder();
        builder.buildGraphicCard();
        builder.buildOs();
        builder.buildRam();
        builder.buildType();
        return (HPComputer) builder.getResult();
    }
 
    // build dell
    public DellComputer buildDell() {
        builder = new DellComputerBuilder();
        builder.buildColor();
        builder.buildOs();
        builder.buildRam();
        builder.buildType();
        return (DellComputer) builder.getResult();
    }
}
 
 
package com.codelifeliwan.builder;
 
public class Client {
    public static void main(String args[]) {
        ComputerDirector director = new ComputerDirector();
 
        Computer HP = director.buildHP();
        System.out.println(HP.toString());
 
        System.out.println("\n=============美丽的分割线==========\n");
 
        Computer Dell = director.buildDell();
        System.out.println(Dell.toString());
    }
}

适用场景:

  • 相同的方法,不同的执行顺序得到的结果不同,即组装顺序不一样得到的结果也不一样
  • 多个部件或者零件都需要装配到一个对象中,但是产生的运行结果不同
  • 产品类非常复杂,需要重复设置的参数非常多

相关文章

网友评论

      本文标题:设计模式:5-建造者模式:Builder

      本文链接:https://www.haomeiwen.com/subject/feezohtx.html