java设计模式之建造者模式

一、建造者的定义与类型

    》定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    建造者模式就是一步步创建一个包含多个组件的对象,相同的构建过程可以创建不同的产品,比较适用于流程固定,建造过程不同的产品。

  》用于只需要指定需要创建的类型就可以得到它们,建造过程及细节不需要

    简单说,比如做菜,每个创建者创建的顺序可以不同,但各个组件一定是要加入的,最终创建一盘菜。 对应于后面代码中会有调用方法的顺序可以比较随意的点

  》类型;创建型。

二、建造者的适用场景。

  》如果一个对象有非常复杂的内部结构(类有很多属性)

  》想把复杂对象的创建和使用分离

三、建造者优点

  》封装性好,创建和使用分离

  》扩展性好、建造者类之间独立、一定程度上解耦。

四、建造者缺点。

  》产生多余的builder对象。

  》产品内部发生变化,建造者都要修改,维护成本大。

五、建造者模式和工厂类相关的模式的差异:

 》工厂者模式更注重于创造产品,建造者模式更关注于方法的调用顺序;

 》创建对象的力度不同。建造者模式可以创建较为复杂的产品,由各种复杂的组件组成,而工厂模式创建出来的产品都是一个样子。

 》工厂模式只是关注创建创造出来即可(只要有一个符合基本要求的产品即可,比如想要一个椅子,但不关心材质,目标只需要一个椅子),而建造者模式不仅关心创造出产品,还关注产品创建的细节,有哪些组件组成。可能因为细节的不同,创建出不一样的产品(比如会关注创造的是什么材质的椅子)。

》当创建一个对象需要复杂的过程时适合建造者模式,而创建一个对象只需要简单的方法时工厂类模式即可。

六、业务场景与代码实例:

 》场景:假设慕课网上有专门的课程课程教练(coatch)负责和某个提供课程的公司的讲师进行对接。讲师负责提供课程相应的材料,而讲师的老总负责指挥。

》代码:

package com.zxl.design.pattern.creational.builder;

/**
 * Created by Administrator on 2019/5/26.
 */
public class Course {
    private String courseName;
    private String coursePPT;
    private String courseArtical;
    private String courseVideo;
    private String courseQA;

    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 getCourseArtical() {
        return courseArtical;
    }

    public void setCourseArtical(String courseArtical) {
        this.courseArtical = courseArtical;
    }

    public String getCourseVideo() {
        return courseVideo;
    }

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

    public String getCourseQA() {
        return courseQA;
    }

    public void setCourseQA(String courseQA) {
        this.courseQA = courseQA;
    }

    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                ", coursePPT='" + coursePPT + '\'' +
                ", courseArtical='" + courseArtical + '\'' +
                ", courseVideo='" + courseVideo + '\'' +
                ", courseQA='" + courseQA + '\'' +
                '}';
    }
}
package com.zxl.design.pattern.creational.builder;

/**
 * Created by Administrator on 2019/5/26.
 */
public abstract class CourseBuilder {
    private String courseName;
    private String coursePPT;
    private String courseArtical;
    private String courseVideo;
    private String courseQA;
    public abstract void buildCourseName(String courseName);
    public abstract void buildCoursePPT(String coursePPT);
    public abstract void buildCourseArtical(String courseArtical);
    public abstract void buildCourseVideo(String courseVideo);
    public abstract void buildCourseQA(String courseQA);

    public abstract Course makeCourse();

}
package com.zxl.design.pattern.creational.builder;

/**
 * Created by Administrator on 2019/5/26.
 */
public class CourseActualBuilder extends CourseBuilder {

    private Course course = new Course();
    public void buildCourseName(String courseName) {
        course.setCourseName(courseName);
    }

    public void buildCoursePPT(String coursePPT) {
        course.setCoursePPT(coursePPT);
    }

    public void buildCourseArtical(String courseArtical) {
        course.setCourseArtical(courseArtical);
    }

    public void buildCourseVideo(String courseVideo) {
        course.setCourseVideo(courseVideo);
    }

    public void buildCourseQA(String courseQA) {
        course.setCourseQA(courseQA);
    }

    public Course makeCourse() {
        return course;
    }
}

 

package com.zxl.design.pattern.creational.builder;

/**
 * Created by Administrator on 2019/5/26.
 */
public class Coatch {
    private CourseBuilder courseBuilder;

    public void setCourseBuilder(CourseBuilder courseBuilder) {
        this.courseBuilder = courseBuilder;
    }

    public Course makeCourse(String courseName, String coursePPT,
                             String courseArtical, String courseVideo,
                             String courseQA) {
        this.courseBuilder.buildCourseName(courseName);
        this.courseBuilder.buildCourseQA(courseQA);
        this.courseBuilder.buildCourseVideo(courseVideo);
        this.courseBuilder.buildCourseArtical(courseArtical);
        this.courseBuilder.buildCoursePPT(coursePPT);
        return this.courseBuilder.makeCourse();
    }

}
package com.zxl.design.pattern.creational.builder;

/**
 * Created by Administrator on 2019/5/26.
 */
public class Test {
    public static void main(String[] args) {
        CourseBuilder courseBuilder =new CourseActualBuilder();
        Coatch coatch = new Coatch();
        coatch.setCourseBuilder(courseBuilder);
        Course course =coatch.makeCourse("java 建造者模式","java 建造者模式PPT",
        "java 建造者模式手记","java 建造者模式视频",
                "java 建造者模式问答");
        System.out.println(course);

    }
}

初级版本:

 

建造者模式之升级版本:这也是比较常见的使用方式,可以进行链式调用,这也是建造者模式的一大特点。

该方式在进行设置属性时比较明确,尤其当属性多时,不容易产生参数因为顺序设置错误等原因造成错误。代码如下:

package com.zxl.design.pattern.creational.builder.buildv2;

/**
 * Created by Administrator on 2019/5/26.
 */
public class Course {
    private String courseName;
    private String coursePPT;
    private String courseArtical;
    private String courseVideo;
    private String courseQA;

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

    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 getCourseArtical() {
        return courseArtical;
    }

    public void setCourseArtical(String courseArtical) {
        this.courseArtical = courseArtical;
    }

    public String getCourseVideo() {
        return courseVideo;
    }

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

    public String getCourseQA() {
        return courseQA;
    }

    public void setCourseQA(String courseQA) {
        this.courseQA = courseQA;
    }
    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                ", coursePPT='" + coursePPT + '\'' +
                ", courseArtical='" + courseArtical + '\'' +
                ", courseVideo='" + courseVideo + '\'' +
                ", courseQA='" + courseQA + '\'' +
                '}';
    }
    public static class CourseBuilder{
        private String courseName;
        private String coursePPT;
        private String courseArtical;
        private String courseVideo;
        private String courseQA;
        public CourseBuilder builderCourseName(String courseName){
            this.courseName = courseName;
            return this;
        }
        public CourseBuilder builderCoursePPT(String coursePPT){
            this.coursePPT = coursePPT;
            return this;
        }
        public CourseBuilder builderCourseArtical(String courseArtical){
            this.courseArtical = courseArtical;
            return this;
        }
        public CourseBuilder builderCourseVideo(String courseVideo){
            this.courseVideo = courseVideo;
            return this;
        }
        public CourseBuilder builderCourseQA(String courseQA){
            this.courseQA = courseQA;
            return this;
        }
        public Course builde(){
            return new Course(this);
        }
    }
}
package com.zxl.design.pattern.creational.builder.buildv2;

import java.net.SocketPermission;

/**
 * Created by Administrator on 2019/5/26.
 */
public class Test {
    public static void main(String[] args) {
        Course course = new Course.CourseBuilder().builderCourseName("java建造者模式v2")
                .builderCoursePPT("java建造者模式v2 PPT")
                .builderCourseArtical("java建造者模式v2手记")
                .builderCourseVideo("java建造者模式v2视频")
                .builderCourseQA("java建造者模式v2问答")
                .builde();

        System.out.println(course);
    }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值