什么是建造者模式?
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
作用:
把复杂对象的构建过程和细节封装起来,用户只需指定需要建造的类型就可以得到它们,方便复用对象。

UML原理图:

\"在这里插入图片描述\"

实例:

/**
 * 产品类
 */
public class Product {

    private List<String> parts=new ArrayList<>();

    public void Add(String part){
        parts.add(part);
    }

    public void show(){
        System.out.println(\"产品创建\");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
/**
 * 建造者抽象类
 */
public abstract class Builder {
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetResult();
}
/**
 * 具体建造者类
 */
public class ConcreteBuild1 extends Builder {

    private Product product=new Product();

    @Override
    public void BuildPartA() {
        product.Add(\"部件A\");
    }

    @Override
    public void BuildPartB() {
        product.Add(\"部件B\");
    }

    @Override
    public Product GetResult() {
        return product;
    }
}
/**
 * 具体建造者
 */
public class ConcreteBuild2 extends Builder {

    private Product product=new Product();

    @Override
    public void BuildPartA() {
        product.Add(\"部件X\");
    }

    @Override
    public void BuildPartB() {
        product.Add(\"部件Y\");
    }

    @Override
    public Product GetResult() {
        return product;
    }
}
/**
 * 指挥者
 */
public class Director {

    public void Construct(Builder builder){
        builder.BuildPartA();
        builder.BuildPartB();
    }
}
public static void main(String[] args){
        Director director=new Director();
        Builder b1=new ConcreteBuild1();
        Builder b2=new ConcreteBuild2();

        director.Construct(b1);
        Product product1=b1.GetResult();
        product1.show();

        director.Construct(b2);
        Product product2=b2.GetResult();
        product2.show();
    }

去掉指挥者使用静态内部类实现建造者,链式调用方式配置参数,构建产品对象。

public class Course {
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;
    private String courseQA;

    public Course(CourseBuilder builder){
        this.courseName=builder.courseName;
        this.coursePPT=builder.coursePPT;
        this.courseVideo=builder.courseVideo;
        this.courseArticle=builder.courseArticle;
        this.courseQA=builder.courseQA;
    }

    @Override
    public String toString() {
        return \"Course{\" +
                \"courseName=\'\" + courseName + \'\\\'\' +
                \", coursePPT=\'\" + coursePPT + \'\\\'\' +
                \", courseVideo=\'\" + courseVideo + \'\\\'\' +
                \", courseArticle=\'\" + courseArticle + \'\\\'\' +
                \", courseQA=\'\" + courseQA + \'\\\'\' +
                \'}\';
    }

    public static class CourseBuilder{
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
        private String courseQA;

        public CourseBuilder buildCourseName(String courseName){
            this.courseName=courseName;
            return this;
        }

        public CourseBuilder buildCoursePPT(String coursePPT){
            this.coursePPT=coursePPT;
            return this;
        }

        public CourseBuilder buildCourseVideo(String courseVideo){
            this.courseVideo=courseVideo;
            return this;
        }

        public CourseBuilder buildCourseArticle(String courseArticle){
            this.courseArticle=courseArticle;
            return this;
        }

        public CourseBuilder buildCourseQA(String courseQA){
            this.courseQA=courseQA;
            return this;
        }

        public Course build(){
            return new Course(this);
        }
    }
}
public static void main(String[] args){
        Course course=new Course.CourseBuilder().buildCourseName(\"设计模式\")
                .buildCourseArticle(\"设计模式手记\")
                .buildCoursePPT(\"PPT精讲\")
                .buildCourseVideo(\"java设计模式视频\")
                .buildCourseQA(\"问答\")
                .build();
        System.out.println(course);
    }
收藏 打印