设计模式——建造者模式(Builder Pattern)

建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

特征:用户只需要指定需要构建类型就可以获得对象,不需要了解构建过程和细节。属于创建型模式。

适用场景:

  • 适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。
  • 如果一个对象有非常复杂的内部结构(很多属性),也可以用建造者模式。
  • 把复杂对象的创建和使用分离。

简单建造者

public interface IBuilder {
    Object build();
}
// 通过建造者类将构建对象的过程封装起来,并通过build方法返回对象
public class CourseBuilder implements IBuilder {
    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); }
    @Override
    public Course build() {
        return course;
    }
}

public class SimpleBuilderTest {
    public static void main(String[] args) {
        CourseBuilder builder = new CourseBuilder();
        builder.addName("建造者模式");
        builder.addNote("课后笔记");
        builder.addPpt("讲义");
        builder.addVideo("视频讲解");
        Course course = builder.build();
        System.out.println(course);
    }
}

建造者模式中应用链式编程

public class CourseBuilder implements IBuilder {
    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;}

    @Override
    public Course build() {
        return course;
    }
}
// 在建造者模式中用链式编程
public class ChainBuilderTest {
    public static void main(String[] args) {
        CourseBuilder builder = new CourseBuilder();
        builder.addName("设计模式").addNote("笔记").addPpt("PPT").addVideo("录播视频");
        Course course = builder.build();
        System.out.println(course);
    }
}

建造者模式在源码中的应用

StringBuilder:线程不安全的

StringBuffer:线程安全的

MyBatis中CacheBuilder

SqlSessionFactoryBuilder

Spring中BeanDefinitionBuilder

// StringBuilder 源码append方法
@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
// StringBuilder使用
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").append("d");

// StringBuffer 源码append方法
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
// StringBuffer使用
StringBuffer sb = new StringBuffer();
sb.append("a").append("b").append("c").append("d");

建造者模式优点:

  • 封装性好,将创建和使用分离。
  • 扩展性好,创建类之间独立,一定程度上解耦。

建造者模式缺点:

  • 产生多于的builder对象
  • 产生内部发生变化,建造者都要修改,改动成本较大。

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

  • 建造者模式更加注重方法的调用顺序和构建过程,工厂模式注重于创建对象。
  • 创建对象的力度不同,建造者模式创建复杂对象,由各种部件组成,不同的部件创建出来的对象不同,而工厂模式创建出来的都一样。
  • 关注点不同,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成。
  • 建造者模式根据创建过程中的顺序不同,最终的对象组成部件也不一样。

面试题

链式编程是建造者模式的标配吗?

链式编程并不是建造者模式的标配,但是为了用户使用更加便捷,代码更加美观,在使用建造者模式时一般会结合链式编程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值