建造者模式更多的是写法上的不同,从代码结构层面上其实没有很大的区别,只是看起来会更清爽一些。
    那怎么实现建造者模式呢?其实也非常简单:

    • 在domain类上创建一个静态内部类 Builder,Builder拥有domain所有的属性
    • 在domain类上创建一个private的构造函数,参数为Builder类型,里边将Builder的属性赋值给domain的属性
    • 在Builder内部类创建domain属性的赋值方法,返回值是Builder
    • Builder内部类创建一个build方法,返回domain实例
    1. public class MessageTask {
    2. private String taskId;
    3. private String content;
    4. private String messageId;
    5. private String taskName;
    6. private MessageTask(Builder builder) {
    7. this.taskId = builder.taskId;
    8. this.content = builder.content;
    9. this.messageId = builder.messageId;
    10. this.taskName = builder.taskName;
    11. }
    12. public static class Builder{
    13. private String taskId;
    14. private String content;
    15. private String messageId;
    16. private String taskName;
    17. public Builder setTaskId(String taskId) {
    18. this.taskId = taskId;
    19. return this;
    20. }
    21. public Builder setContent(String content) {
    22. this.content = content;
    23. return this;
    24. }
    25. public Builder setMessageId(String messageId) {
    26. this.messageId = messageId;
    27. return this;
    28. }
    29. public Builder setTaskName(String taskName) {
    30. this.taskName = taskName;
    31. return this;
    32. }
    33. // 创建build方法,返回实例
    34. public MessageTask build() {
    35. return new MessageTask(this);
    36. }
    37. }
    38. }

    使用

    1. MessageTask.Builder builder = new MessageTask.Builder();
    2. MessageTask task = builder.setContent("关注 Java3y 吧 >>")
    3. .setTaskId("3y")
    4. .setTaskName("一起来玩")
    5. .setMessageId(String.valueOf(ThreadLocalRandom.current().nextLong()))
    6. .build();

    我们如果使用了Lombok后,在类上加上一个注解@Builder就可以使用建造者模式的代码了,非常方便