Java 基础
Java 容器
Java 并发
设计模式
目录

生成器

# 5. 生成器(Builder)

# Intent

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

# Class Diagram


# Implementation

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

package com.code.factory.example4;
import java.util.Arrays;

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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.code.factory.example4;

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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.code.factory.example4;

public class Main {
    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());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
abcdefghijklmnopqrstuvwxyz
1

# JDK

  • java.lang.StringBuilder (opens new window)
  • java.nio.ByteBuffer (opens new window)
  • java.lang.StringBuffer (opens new window)
  • java.lang.Appendable (opens new window)
  • Apache Camel builders (opens new window)