设计模式—建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
优点
- 封装性
- 建造者独立, 容易扩展
- 便于控制细节风险
使用场景
- 相同的方法, 不同的执行顺序, 产生不同的事件结果时, 可以采用建造者模式
- 多个部件或零件, 都可以装配到一个对象中, 但是产生的运行结果又不相同时, 则可以使用该模式。
- 产品类非常复杂, 或者产品类中的调用顺序不同产生了不同的效能, 这个时候使用建造者模式非常合适。
- 在对象创建过程中会使用到系统中的一些其他对象, 这些对象在产品对象的创建过程中不易得到时, 也可以采用建造者模式封装该对象的创建过程。
注意事项
建造者模式关注的是零件类型和装配工艺(顺序) , 这是它与工厂方法模式最大不同的地方, 虽然同为创建类模式, 但是注重点不同。
案例分析
问题
当一个类的构造函数超过4个,而且某些参数是可选的,我们通常有两个方法来构建他的对象。
public class Computer {
    private String cpu;//必须
    private String ram;//必须
    private int usbCount;//可选
    private String keyboard;//可选
    private String display;//可选
}
第一:折叠构造函数模式
public class Computer {
     ...
    public Computer(String cpu, String ram) {
        this(cpu, ram, 0);
    }
    public Computer(String cpu, String ram, int usbCount) {
        this(cpu, ram, usbCount, "罗技键盘");
    }
    public Computer(String cpu, String ram, int usbCount,
                    String keyboard) {
        this(cpu, ram, usbCount, keyboard, "三星显示器");
    }
    public Computer(String cpu, String ram, int usbCount,
                    String keyboard, String display) {
        this.cpu = cpu;
        this.ram = ram;
        this.usbCount = usbCount;
        this.keyboard = keyboard;
        this.display = display;
    }
}
第二种:Javabean 模式
public class Computer {
        ...
    public String getCpu() {
        return cpu;
    }
    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public String getRam() {
        return ram;
    }
    public void setRam(String ram) {
        this.ram = ram;
    }
    public int getUsbCount() {
        return usbCount;
    }
...
}
弊端:
第一种主要是使用及阅读不方便。
第二种方式在构建过程中对象的状态容易发生变化,造成错误。
解决方式
适用建造者模式
- 目标类以及静态建造类
package org.kouhao.design.patterns.建造者模式;
/**
 * 目标类:电脑
 *
 * @author admin
 */
public class Computer {
    private String cpu;//必须
    private String ram;//必须
    private int usbCount;//可选
    private String keyboard;//可选
    private String display;//可选
    public Computer(String cpu, String ram) {
        this.cpu = cpu;
        this.ram = ram;
    }
    public Computer(ComputerBuilder computerBuilder) {
        this.cpu = computerBuilder.cpu;
        this.ram = computerBuilder.ram;
        this.usbCount = computerBuilder.usbCount;
        this.keyboard = computerBuilder.keyboard;
        this.display = computerBuilder.display;
    }
    public void setUsbCount(int usbCount) {
        this.usbCount = usbCount;
    }
    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
    public void setDisplay(String display) {
        this.display = display;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", ram='" + ram + '\'' +
                ", usbCount=" + usbCount +
                ", keyboard='" + keyboard + '\'' +
                ", display='" + display + '\'' +
                '}';
    }
    public static class ComputerBuilder {
        private String cpu;//必须
        private String ram;//必须
        private int usbCount;//可选
        private String keyboard;//可选
        private String display;//可选
        public ComputerBuilder(String cpu, String ram) {
            this.cpu = cpu;
            this.ram = ram;
        }
        public ComputerBuilder usbCount(int usbCount) {
            this.usbCount = usbCount;
            return this;
        }
        public ComputerBuilder keyboard(String keyboard) {
            this.keyboard = keyboard;
            return this;
        }
        public ComputerBuilder display(String display) {
            this.display = display;
            return this;
        }
        public Computer build() {
            return new Computer(this);
        }
    }
}
- 客户端
package org.kouhao.design.patterns.建造者模式;
/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        Computer.ComputerBuilder computerBuilder = new Computer.ComputerBuilder("Inter", "").
                usbCount(1).display("display").keyboard("keyboard");
        computerBuilder.build();
    }
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号