设计模式-04.建造者模式

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

  • 掌握建造者模式的应用场景
  • 掌握建造者模式的基本写法
  • 掌握建造者模式和工厂模式的区别

优点

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

缺点

  1. 产生多余的Builder对象
  2. 产品内部发生变化时建造者都要修改,成本较大,产品变动较频繁时维护成本大,一定程度上违反了开闭原则。

应用场景

  1. 适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。
  2. 如果一个对象有非常复杂的内部结构(很多属性)
  3. 把复杂对象的创建和使用分离

实例

  1. StringBuilder append()方法 (同时也使用了链式编程)

  2. mybatis中的CacheBuilder

  3. SqlSessionFactoryBuilder

  4. Spring中BeanDefinitionBuilder

与工厂模式区别

  • 工厂模式生产的对象不可选配,偏向于生产相同类型不同产品的对象。
  • 建造者模式建造的对象可选配,侧重于生产同一产品不同属性的对象。
  1. 建造者模式注重方法的调用顺序,工厂模式注重于创建对象。
  2. 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样。
  3. 关注点:工厂模式只需要把对象创建出来就可以了,建造者模式中不仅要创建出对象还要知道这个对象由那些部件组成。
  4. 建造者模式根据建造过程的顺序不一样,最终的对象部件组成也不一样。

简单建造者模式写法

@Data
public class Course {

    private String name;
    private String ppt;
    private String video;
    private String note;

    private String homework;

    @Override
    public String toString() {
        return "CourseBuilder{" +
                "name='" + name + '\'' +
                ", ppt='" + ppt + '\'' +
                ", video='" + video + '\'' +
                ", note='" + note + '\'' +
                ", homework='" + homework + '\'' +
                '}';
    }
}
public class CourseBuilder{

    private Course course = new Course();

    public void addName(String name) {
        course.setName(name);
    }
    
    public void addPPT(String ppt) {
        course.setPpt(ppt);
    }
    
    public void addVideo(String video) {
        course.setVideo(video);
    }
    
    public void addNote(String note) {
        course.setNote(note);
    }
    
    public void addHomework(String homework) {
        course.setHomework(homework);
    }
    
    public Course build() {
        return course;
    }
}
public class Test {
    public static void main(String[] args) {
        CourseBuilder builder = new CourseBuilder();

        builder.addName("设计模式");
        builder.addPPT("【PPT课件】");
        builder.addVideo("【回放视频】");
        builder.addNote("【课堂笔记】");
        builder.addHomework("【课后作业】");

        System.out.println(builder.build());

    }
}

建造者模式与链式编程

public class CourseBuilder {
    private Course course = new Course();

    public CourseBuilder addName(String name) {
        course.setName(name);
        return this;
    }

    public CourseBuilder addPPT(String ppt) {
        course.setPpt(ppt);
        return this;
    }

    public CourseBuilder addVideo(String video) {
        course.setVideo(video);
        return this;
    }

    public CourseBuilder addNote(String note) {
        course.setNote(note);
        return this;
    }

    public CourseBuilder addHomework(String homework) {
        course.setHomework(homework);
        return this;
    }

    public Course build() {
        return this.course;
    }

    @Data
    public class Course {

        private String name;
        private String ppt;
        private String video;
        private String note;

        private String homework;

        @Override
        public String toString() {
            return "CourseBuilder{" +
                    "name='" + name + '\'' +
                    ", ppt='" + ppt + '\'' +
                    ", video='" + video + '\'' +
                    ", note='" + note + '\'' +
                    ", homework='" + homework + '\'' +
                    '}';
        }
    }

}
public class Test {
    public static void main(String[] args) {
        //每次操作builder都是返回的CourseBuilder自己,可以直接打点进行链式操作
        CourseBuilder builder = new CourseBuilder()
                    .addName("设计模式")
                    .addPPT("【PPT课件】")
                    .addVideo("【回放视频】")
                    .addNote("【课堂笔记】")
                    .addHomework("【课后作业】");

        System.out.println(builder.build());

    }
}
posted @ 2020-05-03 22:39  嗨!阿克  阅读(112)  评论(0编辑  收藏  举报