建造者模式

一、定义

创建型设计模式
将复杂对象的构建与表示分离,使得同样的构建过程可以有不同的表示
用户只需要指定建造的类型就可以的到(需要将构建的组件传入),不需要知道建造的细节

二、代码

//要创建的课程对象
public class Course {
   //为了方便,我们属性都使用String类型
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCoursePPT() {
        return coursePPT;
    }

    public void setCoursePPT(String coursePPT) {
        this.coursePPT = coursePPT;
    }

    public String getCourseVideo() {
        return courseVideo;
    }

    public void setCourseVideo(String courseVideo) {
        this.courseVideo = courseVideo;
    }

    public String getCourseArticle() {
        return courseArticle;
    }

    public void setCourseArticle(String courseArticle) {
        this.courseArticle = courseArticle;
    }

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

//抽象的courseBuilder
public abstract class CourseBuilder {
    //设置course属性
    public abstract void buildCourseName(String courseName);
    public abstract void buildCoursePPT(String coursePPT);
    public abstract void buildCourseVideo(String courseVideo);
    public abstract void buildCourseArticle(String courseArticle);
    //返回course对象
    public abstract Course makeCourse();
}

//实际上创建course的builder实现类
public class CourseActuallyBuilder extends CourseBuilder {
    private Course course = new Course();
    
    @Override
    public void buildCourseName(String courseName) {
        course.setCourseName(courseName);
    }
    @Override
    public void buildCoursePPT(String coursePPT) {
        course.setCoursePPT(coursePPT);
    }
    @Override
    public void buildCourseVideo(String courseVideo) {
        course.setCourseVideo(courseVideo);
    }
    @Override
    public void buildCourseArticle(String courseArticle) {
        course.setCourseArticle(courseArticle);
    }

    @Override
    public Course makeCourse() {
        return course;
    }
}

//下达命令的coach类
public class Coach {
   //这里注入的是builder的抽象类,我们就可以根据客户端传的builder不同而创建不同的对象
    private CourseBuilder courseBuilder;
    public void setCourseBuilder(CourseBuilder courseBuilder) {
        this.courseBuilder = courseBuilder;
    }
//创建course
    public Course makeCourse(String courseName, String coursePPT, String courseVideo, String couresArticle) {
        courseBuilder.buildCourseName(courseName);
        courseBuilder.buildCoursePPT(coursePPT);
        courseBuilder.buildCourseVideo(courseVideo);
        courseBuilder.buildCourseArticle(couresArticle);
        return courseBuilder.makeCourse();
    }
}

//test测试类(客户端)
public class Test {
    public static void main(String[] args) {
        Coach coach = new Coach();
        coach.setCourseBuilder(new CourseActuallyBuilder());
        Course course = coach.makeCourse("Java设计模式","Java设计模式PPT",
                "Java设计模式视频","Java设计模式手记");
        System.out.println(course);
    }
}

进阶版的建造者模式
演进版的建造者模式,把对象的建造者写在内部类,在测试类使用链式调用,再调用build就可以拿到想要的对象,简化类调用,也极大的避免了因为给coach传错建造者而创造对象错误的情况。
这种写法在开发中会比较常用

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

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

    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                ", coursePPT='" + coursePPT + '\'' +
                ", courseVideo='" + courseVideo + '\'' +
                ", courseArticle='" + courseArticle + '\'' +
                '}';
    }
    //定义一个内部类--建造者
    public static class CourseBuilder{
        //和产品相同的属性
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
        //为了可以链式调用,需要将当前对象返回
        public CourseBuilder buildeCourseName(String courseName){
            this.courseName = courseName;
            return this;
        }
        public CourseBuilder buildeCoursePPT(String coursePPT){
            this.coursePPT = coursePPT;
            return this;
        }
        public CourseBuilder buildeCourseVideo(String courseVideo){
            this.courseVideo = courseVideo;
            return this;
        }
        public CourseBuilder buildeCourseArticle(String courseArticle){
            this.courseArticle = courseArticle;
            return this;
        }
        //调用Course的构造器,并将当前builder的值传进
        public Course build(){
            return new Course(this);
        }
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        Course course = new Course.CourseBuilder().buildeCourseName("java设计模式")
                .buildeCoursePPT("java设计模式PPT").buildeCourseVideo("java设计模式视频").build();
        System.out.println(course);
    }
}

三、适用场景

1、如果一个对象有非常多的内部结构,属性比较多的时候
2、想把对象的创建和适用进行分离

优点:
1、封装性好,创建和使用分离。
2、扩展性好,建造类之间相互独立,一定程度上解耦。
缺点:
1、会建造多余的builder对象
2、 产品内部结构发生变化,建造者都需要修改,改动根据业务或大或小,成本比较高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值