5. 生成器(Builder)

Intent

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

Class Diagram

设计模式 - 生成器 - 图1

Implementation

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

  1. public class AbstractStringBuilder {
  2. protected char[] value;
  3. protected int count;
  4. public AbstractStringBuilder(int capacity) {
  5. count = 0;
  6. value = new char[capacity];
  7. }
  8. public AbstractStringBuilder append(char c) {
  9. ensureCapacityInternal(count + 1);
  10. value[count++] = c;
  11. return this;
  12. }
  13. private void ensureCapacityInternal(int minimumCapacity) {
  14. // overflow-conscious code
  15. if (minimumCapacity - value.length > 0)
  16. expandCapacity(minimumCapacity);
  17. }
  18. void expandCapacity(int minimumCapacity) {
  19. int newCapacity = value.length * 2 + 2;
  20. if (newCapacity - minimumCapacity < 0)
  21. newCapacity = minimumCapacity;
  22. if (newCapacity < 0) {
  23. if (minimumCapacity < 0) // overflow
  24. throw new OutOfMemoryError();
  25. newCapacity = Integer.MAX_VALUE;
  26. }
  27. value = Arrays.copyOf(value, newCapacity);
  28. }
  29. }
  1. public class StringBuilder extends AbstractStringBuilder {
  2. public StringBuilder() {
  3. super(16);
  4. }
  5. @Override
  6. public String toString() {
  7. // Create a copy, don't share the array
  8. return new String(value, 0, count);
  9. }
  10. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. StringBuilder sb = new StringBuilder();
  4. final int count = 26;
  5. for (int i = 0; i < count; i++) {
  6. sb.append((char) ('a' + i));
  7. }
  8. System.out.println(sb.toString());
  9. }
  10. }
  1. abcdefghijklmnopqrstuvwxyz

JDK

设计模式 - 生成器 - 图2