创建型 - 生成器(Builder)

arcstack约 499 字大约 2 分钟

创建型 - 生成器(Builder)

本文主要分析设计模式 - 生成器(Builder),封装一个对象的构造过程,并允许按步骤构造。 @pdai

意图

封装一个对象的构造过程,并允许按步骤构造。

类图

13b0940e-d1d7-4b17-af4f-b70cb0a75e08.png
13b0940e-d1d7-4b17-af4f-b70cb0a75e08.png

实现

以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。

    public class AbstractStringBuilder {
        protected char[] value;

        protected int count;

        public AbstractStringBuilder(int capacity) {
            count = 0;
            value = new char[capacity];
        }

        public AbstractStringBuilder append(char c) {
            ensureCapacityInternal(count + 1);
            value[count++] = c;
            return this;
        }

        private void ensureCapacityInternal(int minimumCapacity) {
            // overflow-conscious code
            if (minimumCapacity - value.length > 0)
                expandCapacity(minimumCapacity);
        }

        void expandCapacity(int minimumCapacity) {
            int newCapacity = value.length * 2 + 2;
            if (newCapacity - minimumCapacity < 0)
                newCapacity = minimumCapacity;
            if (newCapacity < 0) {
                if (minimumCapacity < 0) // overflow
                    throw new OutOfMemoryError();
                newCapacity = Integer.MAX_VALUE;
            }
            value = Arrays.copyOf(value, newCapacity);
        }
    }

    public class StringBuilder extends AbstractStringBuilder {
        public StringBuilder() {
            super(16);
        }

        @Override
        public String toString() {
            // Create a copy, don't share the array
            return new String(value, 0, count);
        }
    }

    public class Client {
        public static void main(String[] args) {
            StringBuilder sb = new StringBuilder();
            final int count = 26;
            for (int i = 0; i < count; i++) {
                sb.append((char) ('a' + i));
            }
            System.out.println(sb.toString());
        }
    }

    abcdefghijklmnopqrstuvwxyz

JDK

参考

  • 生成器(Builder) https://www.jianshu.com/p/5d34a496e517
  • 生成器(Builder)- 最易懂的设计模式解析 https://www.jianshu.com/p/7deb64f902db

总结

知识点的东西在上面参考文章中写的非常详细,读完之后问自己下面几个问题,直到可以流利的回答。

  • 使用的场景?

  • 本质是什么?

  • 它解决了什么问题?

  • 它体现了设计模式中什么原则?

  • 存在的缺陷?

  • 你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?

  • *开源架构中哪些使用了这一模式?

上次编辑于:
贡献者: javatodo