设计模式-建造者模式

2020-09-18 11:22:43 浏览数 (1)

建造者模式是什么?

建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用于专门创建个性化的对象。区别于工厂,每个工厂生产出来的产品都是一样的,而建造者可以根据用户的不同需要,生产不同的产品。

其中包含角色:

Builder:抽象建造者

ConcreteBuilder:具体建造者

Director:指挥者/监工

Product:产品

建造者模式可以干嘛?

主要用来创建个性化的产品,主要解决同一样的产品输出不同的个性化要求。比如:你需要一台台式电脑,其中包含:显示器、机箱(主板、内存条、显卡、硬盘、键盘、鼠标)等,如果是工厂模式,每个工厂输出的产品都是一模一样的配置。而如果是建造者模式,可以个性化选配,比如高配和低配。而其中你(指挥者)、电脑(产品)、装电脑人员(具体建造者)、抽象建造者(人/组装人员)

优点:

解耦:不同的组件可以个性化选择,精细化的控制每个产品的创建过程;

易拓展:新增加一些属性和功能很方便;

符合开闭原则:原功能不受影响,需要新的功能在基础上增加就可以了;

缺点:

该模式只适合创建出来的产品存在很多共同点,而不是差异性很大,所以使用范围受到一定的限制;

如果产品内部过于复杂,会导致代码可读性降低,代码臃肿;

类图

注意:建议先看下这个类图,若不懂请看到懂为止,实在看不懂多找点资料吧,我是踩过坑的,需要要了解一下原理!切记!切记!切记!

实现代码

代码语言:javascript复制
package com.hong.base.buildmodel.computer;

/**
 * @Auther: csh
 * @Date: 2020/5/18 11:17
 * @Description:抽象电脑(抽象产品)
 */
public class Computer {
    //cpu
    private String cpu;
    //品牌
    private String brand;
    //主板
    private String mainBorad;
    //显示器
    private String displayer;
    //价格
    private String money;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getMainBorad() {
        return mainBorad;
    }

    public void setMainBorad(String mainBorad) {
        this.mainBorad = mainBorad;
    }

    public String getDisplayer() {
        return displayer;
    }

    public void setDisplayer(String displayer) {
        this.displayer = displayer;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Computer{"  
                "cpu='"   cpu   '''  
                ", brand='"   brand   '''  
                ", mainBorad='"   mainBorad   '''  
                ", displayer='"   displayer   '''  
                ", money='"   money   '''  
                '}';
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 11:13
 * @Description:抽象建造者
 */
public abstract class Builder {
    //吕牌
    public abstract void buildBrand();
    //cpu
    public abstract void buildCpu();
    //主版
    public abstract void buildMainBoard();
    //显示器
    public abstract void buildDisplay();
    //获取电脑
    public abstract Computer getComputer();
    
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 11:49
 * @Description:戴尔笔记本(builder角色)
 */
public class DellComputerBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void buildBrand() {
        computer.setBrand("戴尔笔记本");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("16核");
    }

    @Override
    public void buildMainBoard() {
        computer.setMainBorad("1万块主板");
    }


    @Override
    public void buildDisplay() {
        computer.setDisplayer("戴尔显示器");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
    
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:11
 * @Description:联想建造者
 */
public class LenovoComputerBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void buildBrand() {
        computer.setBrand("联想电脑");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("低配版");
    }

    @Override
    public void buildMainBoard() {
        computer.setMainBorad("低配主板");
    }


    @Override
    public void buildDisplay() {
        computer.setDisplayer("16寸显示器");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:13
 * @Description:组装类(指挥者)
 * 该类是指挥拼专的,就像以前的监工
 */
public class ComputerDirector {
    public Computer construct(Builder builder){
        //构建产品
        Computer computer;
        builder.buildBrand();
        builder.buildCpu();
        builder.buildDisplay();
        builder.buildMainBoard();
        computer = builder.getComputer();
        return computer;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:15
 * @Description:建造者模式测试
 */
public class Client {
    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();
        Computer construct = director.construct(new LenovoComputerBuilder());
        System.out.println(construct);
        System.out.println("-----------------------------------------------");
        Computer construct1 = director.construct(new DellComputerBuilder());
        System.out.println(construct1);
    }
}

结果

代码语言:javascript复制
Computer{cpu='低配版', brand='联想电脑', mainBorad='低配主板', displayer='16寸显示器', money='null'}
--------------------
Computer{cpu='16核', brand='戴尔笔记本', mainBorad='1万块主板', displayer='戴尔显示器', money='null'}

实现场景

日常开发过程中,遇到一些组件经常变换,这种就比较适合建造者模式了,比如同一部手机有不同的颜色,不同的配置,但是基础的外型是一致的。

0 人点赞