zoukankan      html  css  js  c++  java
  • JavaBuilder模式实现

    一、借助lombok之@Builder注解

    1. User类源码:
    package com.yang.webflux.controller;
    
    import lombok.Builder;
    
    /**
     * @author: Yang
     * @date: 2017/3/26 23:55
     * @description:
     */
    @Builder
    public class User {
    
        private long id;
    
        private String name;
    
        private int age;
    
    }
    
    1. lombok插件配合@Builder注解介入编译再反编译的源码:
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.yang.webflux.controller;
    
    public class User {
    
        private long id;
    
        private String name;
    
        private int age;
    
        User(long id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public static User.UserBuilder builder() {
            return new User.UserBuilder();
        }
    
        public static class UserBuilder {
    
            private long id;
    
            private String name;
    
            private int age;
    
            UserBuilder() {
            }
    
            public User.UserBuilder id(long id) {
                this.id = id;
                return this;
            }
    
            public User.UserBuilder name(String name) {
                this.name = name;
                return this;
            }
    
            public User.UserBuilder age(int age) {
                this.age = age;
                return this;
            }
    
            public User build() {
                return new User(this.id, this.name, this.age);
            }
    
            public String toString() {
                return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")";
            }
        }
    
    }
    
    1. 使用:
    public static void main(String[] args) {
            User user = User.builder()
                    .id(1L)
                    .name("yang")
                    .age(3)
                    .build();
    }
    

    二、手动实现:

    package com.yang.webflux.controller;
    
    import lombok.Data;
    
    /**
     * @author: Yang
     * @date: 2017/3/26 23:41
     * @description:
     */
    public class MyDsl {
    
        public static void main(String[] args) {
            Dog yang = Dog.builder().age(1).id(3L).name("yang").build();
            System.out.println(yang.getAge());
            System.out.println(yang.getId());
            System.out.println(yang.getName());
        }
    
    }
    
    @Data
    class Dog {
    
        private long id;
    
        private String name;
    
        private int age;
    
        /**
         * 此构造函数的传参与lombok的有所不同
         */
        private Dog(Builder builder) {
            this.id = builder.id;
            this.name = builder.name;
            this.age = builder.age;
        }
    
        public static Builder builder() {
            return new Dog.Builder();
        }
    
        public static final class Builder {
    
            private long id;
    
            private String name;
    
            private int age;
    
            public Builder() {
            }
    
            public Builder id(long id) {
                this.id = id;
                return this;
            }
    
            public Builder name(String name) {
                this.name = name;
                return this;
            }
    
            public Builder age(int age) {
                this.age = age;
                return this;
            }
    
            public Dog build() {
                return new Dog(this);
            }
        }
    
    }
    

    三、两种实现的源码差异较小,需要手动实现的场景里,可以参考。

    学习使我充实,分享给我快乐!
  • 相关阅读:
    用最简单的例子理解装饰器模式(Decorator Pattern)
    用最简单的例子理解迭代器模式(Iterator Pattern)
    用最简单的例子理解观察者模式(Observer Pattern)
    用最简单的例子理解单例模式(Singleton Pattern)
    用最简单的例子理解对象为Null模式(Null Object Pattern)
    用最简单的例子理解策略模式(Strategy Pattern)
    使用Lazy<T>实现对客户订单的延迟加载
    C#关键字var是什么,在何种情况下使用
    C#中的IDisposable模式
    CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/14891725.html
Copyright © 2011-2022 走看看