设计模式-建造者模式(Builder )

526 阅读2分钟

Github 源码地址

23种设计模式总览

创建型模式

结构型模式

行为型模式

模式介绍

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时;
  2. 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
  3. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;

一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用 builder模式进行重构,示例代码:

未使用builder模式前

public class Computer {
    private String cpu;
    private String screen;
    private String memory;
    private String mainBoard;

    public Computer(String cpu, String screen, String memory, String mainBoard) {
        this.cpu = cpu;
        this.screen = screen;
        this.memory = memory;
        this.mainBoard = mainBoard;
    }
}

使用builder模式后


public class NewComputer {
    private String cpu;
    private String screen;
    private String memory;
    private String mainBoard;

    public static final class Builder {
        private NewComputer mNewComputer;

        public Builder() {
            mNewComputer = new NewComputer();
        }

        public Builder cpu(String val) {
            mNewComputer.cpu = val;
            return this;
        }

        public Builder screen(String val) {
            mNewComputer.screen = val;
            return this;
        }

        public Builder memory(String val) {
            mNewComputer.memory = val;
            return this;
        }

        public Builder mainBoard(String val) {
            mNewComputer.mainBoard = val;
            return this;
        }

        public NewComputer create() {
            return mNewComputer;
        }

    }
}
class Test {
    public static void main(String[] args) {

        //非Builder 模式 
        Computer computer = new Computer("cpu", "screen", "memory", "mainboard");
        
        //Builder 模式 
        NewComputer newComputer = new NewComputer.Builder()
                .cpu("cpu")
                .screen("screen")
                .memory("memory")
                .mainBoard("mainBoard")
                .create();
    }
}

上面的示例代码只是传入四个参数,如果参数是几十个甚至更多,builder 模式的优势将会更加明显,传递参数更加灵活,代码具有更高的可读性.

代码地址: