zoukankan      html  css  js  c++  java
  • 设计模式:建造者模式

    定义

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

    场景:

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

    链式写法

    @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);
        }
        ....
    
  • 相关阅读:
    Leetcode: Increasing Triplet Subsequence
    Snapchat面经(师兄的)
    M面经prepare: Shuffle a deck
    M面经Prepare: Find integer Average of 2 integers.
    M面经Prepare: Positive-Negative partitioning preserving order
    M面经Prepare: Delete Words Starting With One Character
    Lintcode: Subtree
    Leetcode: Reconstruct Itinerary
    Groupon面经:Find paths in a binary tree summing to a target value
    一些小感悟(2014.04版)
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14227299.html
Copyright © 2011-2022 走看看