目的

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

类图

生成器类图.png

实现

以下是一个简易的 StringBuilder 实现,参考了 JDK1.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. ensuseCapacityInternal(count + 1);
  10. value[count++] = c;
  11. return this;
  12. }
  13. private void ensuseCapacityInternal(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. new Capacity = Integer.MAX_VALUE;
  26. }
  27. value = Arrays.copyOf(value, newCapacity);
  28. }
  29. }
  30. public class StringBuilder extends AbstractStringBuilder{
  31. public StringBuilder(){
  32. super(16);
  33. }
  34. @Override
  35. public String toString(){
  36. //Create a copy, don't share the array
  37. return new String(value, 0, count);
  38. }
  39. }
  40. public class Client{
  41. public static void main(String[] args){
  42. StringBuilder sb = new StringBuilder();
  43. final int count = 26;
  44. for(int i = 0; i < count; i++){
  45. sb.append((char) ('a' + i));
  46. }
  47. System.out.println(sb.toString());
  48. }
  49. }
  50. 运行结果
  51. abcdefghijklmnopqrstuvwxyz

JDK中的体现