设计模式4-建造者模式

定义

  1. 建造者模式是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
  2. 用户只需要指定需要建造的类型就可以创建他们,创建过程及细节不需要知道。
  3. 类型: 创建型

适用场景

  1. 如果一个对象有非常复杂的内部结构(属性多)
  2. 把复杂的对象的创建和使用分离

优点

  1. 封装性好 创建和使用分离
  2. 拓展性好,建造类之间独立,一定程度上解耦

缺点

  1. 产生多余的builder对象
  2. 产品内部发生变化,建造者需要进行修改

建造者模式与工厂模式的区别

  1. 建造者模式更注重于方法的调用顺序,工厂模式更注重于创建产品
  2. 创建对象的力度不同,工厂模式创建复杂产品可以由各种部件组成,工厂模式创建出来的产品相同。
  3. 工厂模式只需要创建出来,创建者模式需要知道该产品都有哪些部件。
  4. 创建一个对象需要很多步骤时适用于建造者模式,只需要简单创建则工厂模式就可以。

Conding

Lombok插件中的@Builder注解提供的构建对象的方式就是典型的建造者模式。

package com.example.design.creational.course.v2;

import lombok.Data;
import lombok.ToString;

/**
 * 建造者模式 静态内部类
 *
 * @author wang
 */
@Data
@ToString
public class Course {
    private String courseName;
    private String coursePpt;
    private String courseVideo;
    private String courseArticle;
    private String courseQa;

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

    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);
        }
    }

}

使用时可以直接使用builder方式进行创建对象

package com.example.design.creational.course.v2;


/**
 * @author wang
 */
public class Test {
    public static void main(String[] args) {
        Course course = new Course.CourseBuilder().
                buildCourseArticle("article").
                buildCourseName("name").
                buildCoursePpt("ppt").
                buildCourseQa("qa").
                buildCourseVideo("video")
                .build();
        System.out.println(course);


    }
}

发布了28 篇原创文章 · 获赞 13 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_26483671/article/details/103943207