GOF 设计模式 builder模式笔记

Builder(生成器)

意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。
在以下情况使用Builder模式

  • 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

结构图
在这里插入图片描述

builder模式更注重与一个复杂对象的创建,像组装一样,一层一层,一个模块一个模块的装配,是一个由简单对象到复杂对象的过程。
假设现在去淘宝请人组装机子,一台好的(goodcomputer),一台差的(badcomputer)
Direct 导向器就像淘宝商家,你给他套餐(good or bad Builder)订单,剩下的准备材料和组装过程你就没必要知道了,只要下单就行,然后根据订单收货。

Computer(省略get set)

public  class Computer {
    private String cpu;
    private String gpu;
    private String memory;
    private String keyboard;
    private String mouse;

builder 接口

public class ComputerDirector {
    public void create(ComputerBuilder builder){
        builder.builder();
    }
}

bad套餐

public class BadBuilder extends ComputerBuilder {
    private Computer computer ;
    @Override
    void builder() {
        computer = new Computer();
        computer.setCpu("i3-3");
        computer.setGpu("760");
        computer.setMouse("双飞燕");
        computer.setKeyboard("双飞燕");
        computer.setMemory("4G");
    }
    public Computer getComputer(){
        return computer;
    }
}

good套餐


public class GoodBuilder extends ComputerBuilder {
    private Computer computer ;
    @Override
    void builder() {
        computer = new Computer();
        computer.setCpu("i9-10");
        computer.setGpu("2060");
        computer.setKeyboard("机械");
        computer.setMemory("16GSSD");
        computer.setMouse("电竞鼠");
    }
    public Computer getComputer(){
        return computer;
    }
}

Director 导向器,执行builder的组装

public class ComputerDirector {
    public void create(ComputerBuilder builder){
        builder.builder();
    }
}

client

public class Client {
    public static void main(String[] args) {
        ComputerBuilder good = new GoodBuilder();
        ComputerDirector computerDirector = new ComputerDirector();
        computerDirector.create(good);
        Computer computer = ((GoodBuilder) good).getComputer();
        System.out.println(computer);
    }
}

更加常用的方式

构造参数过多时可以用builder构造
Computer

public  class Computer {
    private String cpu;
    private String gpu;
    private String memory;
    private String keyboard;
    private String mouse;

    public Computer(Builder builder){
        this.cpu = builder.cpu;
        this.gpu = builder.gpu;
        this.memory = builder.memory;
        this.keyboard = builder.keyboard;
        this.mouse = builder.mouse;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", gpu='" + gpu + '\'' +
                ", memory='" + memory + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", mouse='" + mouse + '\'' +
                '}';
    }

    static class Builder{
        private String cpu;
        private String gpu;
        private String memory;
        private String keyboard;
        private String mouse;

        public  Builder(String cpu,String gpu,String memory){
            this.cpu=cpu;
            this.gpu=gpu;
            this.memory=memory;
        }
        public Builder keyboard(String keyboard){
            this.keyboard = keyboard;
            return this;
        }
        public Builder mouse(String mouse){
            this.mouse=mouse;
            return this;
        }
        public Computer builder(){
            return new Computer(this);
        }
    }

}

public class client {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder("i9","2060","16G")
        .keyboard("机械").mouse("电竞鼠").builder();
        System.out.println(computer);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值