• 设计模式:建造者模式


    定义

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

    场景:

    • 相同方法,不同执行顺序,产生不同结果
    • 多个部件或零件,都可以装配到一个对象中,但是产生结果不同
    • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
    • 初始化一个对象特别复杂,参数多,而且很多参数都有默认值。

    链式写法

    @Data
    public class Product {
        private String field;
        private String field2;
        private String field3;
    
    }
    
    public interface IBuild {
        Product build();
    }
    
    public class Build implements IBuild{
    
        private Product product = new Product();
    
        @Override
        public Product build() {
            return product;
        }
    
        public Build field(String field){
            product.setField(field);
            return this;
        }
    
        public Build field2(String field2){
            product.setField2(field2);
            return this;
        }
    
        public Build field3(String field3){
            product.setField3(field3);
            return this;
        }
    
        public Product builder(){
            return product;
        }
    }
    

    测试:

        public static void main(String[] args) {
            Product product = new Build().field("1").field2("2").field3("3").builder();
            System.out.println(product);
        }
    

    uml:

    image-20210103222608404

    静态内部类写法

    一般来说,静态内部类这种写法你可能遇见的次数要比上一种写法多,因为这种写法产品与创建之间的联系更加紧密,结构更加紧凑,建造者模式的形式更加简洁。

    @Data
    public class Product {
    
        private String field;
        private String field2;
        private String field3;
    
        public static class Builder{
            private Product product = new Product();
    
            public Product build() {
                return product;
            }
    
            public Builder field(String field){
                product.setField(field);
                return this;
            }
    
            public Builder field2(String field2){
                product.setField2(field2);
                return this;
            }
    
            public Builder field3(String field3){
                product.setField3(field3);
                return this;
            }
    
            public Product builder(){
                return product;
            }
        }
    }
    

    测试

            Product builder = new Product.Builder().field("1").field2("2").field3("3").builder();
            System.out.println(builder);
    

    JDK源码中的运用

    StringBuilder就是一个很典型的例子,它提供append方法,开放构造步骤,最后调用toString方法就可以获得一个构造好的字符串。

        ....
        @Override
        public StringBuilder append(Object obj) {
            return append(String.valueOf(obj));
        }
    
        @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
        ....
            
            @Override
        public String toString() {
            // Create a copy, don't share the array
            return new String(value, 0, count);
        }
        ....
    
  • 相关阅读:
    装黑苹果遇到的术语
    关于Android方法数量限制的问题
    使用LeakCanary遇到的问题 就是不弹出来
    Android内存泄露自动检测神器LeakCanary
    Android开发常见的Activity中内存泄漏及解决办法
    LeakCanary 中文使用说明
    LeakCanary: 让内存泄露无所遁形
    LeakCanary——直白的展现Android中的内存泄露
    【腾讯Bugly干货分享】Android内存优化总结&实践
    Java基础--定时任务Timer
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14227299.html
Copyright © 2020-2023  润新知