建造者模式简介

  • 模式属于创立型模式,它提供了一种创建对象的最佳形式。
  • 应用多个简略的对象一步一步构建成一个简单的对象。
  • 一个Builder类会一步一步结构最终的对象。该Builder类是独立于其余对象的。
指挥者模式
产品类Product
//产品public class Product {    private String one;    private String two;    private String three;    public String getOne() {        return one;    }    public void setOne(String one) {        this.one = one;    }    public String getTwo() {        return two;    }    public void setTwo(String two) {        this.two = two;    }    public String getThree() {        return three;    }    public void setThree(String three) {        this.three = three;    }    @Override    public String toString() {        return "Product{" +                "one='" + one + '\'' +                ", two='" + two + '\'' +                ", three='" + three + '\'' +                '}';    }}
抽象类Builder
//形象的建造者public abstract class Builder {    abstract void one();//第一步工序    abstract void two();//第二步工序    abstract void three();//第三步工序    abstract Product getProduct();//竣工,失去产品}
子类Worker
//具体的建造者:工人public class Worker extends Builder {    private Product product;    public Worker() {        product = new Product();    }    @Override    void one() {        product.setOne("第一步工序");        System.out.println("第一步工序");    }    @Override    void two() {        product.setTwo("第二步工序");        System.out.println("第二步工序");    }    @Override    void three() {        product.setThree("第三步工序");        System.out.println("第三步工序");    }    @Override    Product getProduct() {        return product;    }}
指挥者类
//指挥者public class Director {    //指挥工人生成产品    public Product build(Builder builder){        builder.one();        builder.two();        builder.three();        return builder.getProduct();    }}
测试类
public class Test {    public static void main(String[] args) {        //指挥者        Director director = new Director();        //指挥工人生产产品        Product product = director.build(new Worker());        System.out.println(product);        /**         * 输入后果:         * 第一步工序         * 第二步工序         * 第三步工序         * Product{one='第一步工序', two='第二步工序', three='第三步工序'}         */    }}
测试后果
第一步工序第二步工序第三步工序Product{one='第一步工序', two='第二步工序', three='第三步工序'}
外部类模式
产品类Product
//产品public class Product {    private String one = "第一步工序";    private String two = "第二步工序";    private String three = "第三步工序";    public String getOne() {        return one;    }    public void setOne(String one) {        this.one = one;    }    public String getTwo() {        return two;    }    public void setTwo(String two) {        this.two = two;    }    public String getThree() {        return three;    }    public void setThree(String three) {        this.three = three;    }    @Override    public String toString() {        return "Product{" +                "one='" + one + '\'' +                ", two='" + two + '\'' +                ", three='" + three + '\'' +                '}';    }}
抽象类Builder
//形象的建造者public abstract class Builder {    abstract Builder one(String mes);//第一步工序    abstract Builder two(String mes);//第二步工序    abstract Builder three(String mes);//第三步工序    abstract Product getProduct();//竣工,失去产品}
子类Worker
//具体的建造者:工人public class Worker extends Builder {    private Product product;    public Worker() {        product = new Product();    }    @Override    Builder one(String mes) {        product.setOne(mes);        return this;    }    @Override    Builder two(String mes) {        product.setTwo(mes);        return this;    }    @Override    Builder three(String mes) {        product.setThree(mes);        return this;    }    @Override    Product getProduct() {        return product;    }}
测试类
public class Test {    public static void main(String[] args) {        //工人        Worker worker = new Worker();        //生产产品        Product product = worker.getProduct();        System.out.println(product.toString());        /**         * 输入后果:         * Product{one='第一步工序', two='第二步工序', three='第三步工序'}         */        //链式编程        product = worker.one("第一步额定工序").three("提前第三步工序").getProduct();        System.out.println(product);        /**         * 输入后果:         * Product{one='第一步额定工序', two='第二步工序', three='提前第三步工序'}         */    }}
测试后果
Product{one='第一步工序', two='第二步工序', three='第三步工序'}Product{one='第一步额定工序', two='第二步工序', three='提前第三步工序'}