美文网首页Java 杂谈
设计模式之建造者(Builder)

设计模式之建造者(Builder)

作者: ikonan | 来源:发表于2018-07-27 09:06 被阅读4次

    介绍

    建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。

    使用场景

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

    UML类图

    建造者(Builder)模式类图

    角色介绍

    • Product 产品类 : 产品的抽象类;
    • Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程;
    • ConcreteBuilder: 具体的构建器;
    • Director:统一组装过程(可省略)

    Builder模式简单实现

    Builder模式最典型的例子,就是组装电脑的例子了

    创建产品类

    public class Computer {
    
        private String cpu;
        private String ram;
    
        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;
        }
    }
    

    创建Builder类: 组装电脑有一套组装方法的模版,就是一个抽象的Builder类,里面提供了安装CPU、内存的方法,以及组装成电脑的create方法

    public interface Builder {
    
        public void buildCpu(String cpu);
        public void buildRam(String ram);
    
        public Computer create();
    }
    
    

    实现了抽象的Builder类,ComputerBuilder类用于组装电脑:

    public class ComputerBuilder implements Builder{
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu(String cpu) {
            computer.setCpu(cpu);
        }
    
        @Override
        public void buildRam(String ram) {
            computer.setRam(ram);
        }
    
        @Override
        public Computer create() {
            return computer;
        }
    }
    

    客户端调用指挥者类
    最后商家用指挥者类组装电脑。我们只需要提供我们想要的CPU,内存就可以了,至于商家怎样组装的电脑我们无需知道。

    public class Client {
    
        public static void main(String[] args) {
    
            Builder builder = new ComputerBuilder();
            Director director = new Director(builder);
    
            //组装电脑
            Computer computer = director.createComputer("i5-3210","DDR4");
            System.out.println(">>>>cpu:"+computer.getCpu()+
                                  " ram:"+computer.getRam());
        }
    }
    
    运行结果:
    >>>>cpu:i5-3210 ram:DDR4
    

    Builder模式变种(常用)

    通过静态内部类等方式实现的零件无序话构造:

    
    public class Computer {
    
        private String cpu;
        private String ram;
    
        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 static class Builder {
            private Computer computer = new Computer();
    
            public Builder setCpu(String cpu) {
                computer.setCpu(cpu);
                return this;
            }
    
            public Builder setRam(String ram) {
                computer.setRam(ram);
                return this;
            }
    
            public Computer create() {
                return computer;
            }
        }
    }
    

    客户端调用

    public class Client {
    
        public static void main(String[] args) {
    
            Computer.Builder builder = new Computer.Builder();
            Computer computer = builder.setCpu("i5-3210")
                    .setRam("DDR4").create();
    
            System.out.println(">>>>cpu:"+computer.getCpu()+
                                  " ram:"+computer.getRam());
        }
    }
    
    运行结果:
    >>>>cpu:i5-3210 ram:DDR4
    

    总结

    • 定义一个静态内部类Builder,内部的成员变量和外部类一样
      Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)。
    • Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder。
    • 外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值。

    相关文章

      网友评论

        本文标题:设计模式之建造者(Builder)

        本文链接:https://www.haomeiwen.com/subject/ebhwmftx.html