Computer.java

package com.designpatterns.creational.builder.classic;

import java.util.Objects;

public final class Computer {

    private final String cpu;
    private final int ramGb;
    private final int storageGb;
    private final boolean hasGraphicsCard;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ramGb = builder.ramGb;
        this.storageGb = builder.storageGb;
        this.hasGraphicsCard = builder.hasGraphicsCard;
    }

    public String cpu() {
        return cpu;
    }

    public int ramGb() {
        return ramGb;
    }

    public int storageGb() {
        return storageGb;
    }

    public boolean hasGraphicsCard() {
        return hasGraphicsCard;
    }

    public static Builder builder(String cpu) {
        return new Builder(cpu);
    }

    public static final class Builder {

        private final String cpu;
        private int ramGb = 8;
        private int storageGb = 256;
        private boolean hasGraphicsCard = false;

        private Builder(String cpu) {
            this.cpu = Objects.requireNonNull(cpu, "cpu must not be null");
        }

        public Builder ramGb(int ramGb) {
            this.ramGb = ramGb;
            return this;
        }

        public Builder storageGb(int storageGb) {
            this.storageGb = storageGb;
            return this;
        }

        public Builder withGraphicsCard() {
            this.hasGraphicsCard = true;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }
}