📄 +ݢ
字号:
// Director.java
/**
* This class is used to read data from text file,
* then pass the data to TestCaseBuilder's buildXXX
* method to construct part of the TestCaseObject.
*/
public class Director {
private final String FILENAME = "TestCaseData.txt";
private final int INT = 0;
private final int LONG = 1;
private final int FLOAT = 2;
private final int DOUBLE = 3;
private final int CHAR = 4;
private final int STRING = 5;
// Reference to Builder.
private Builder builder;
// This ArrayList contains data read from file,
// every item in it represents a property in TestCaseObject,
// it's format is "PropertyName, Type, Value",
// the Type is listed above.
private java.util.ArrayList dataLines;
// Constructor, initiate builder and dataLines.
public Director() {
builder = new TestCaseBuilder();
dataLines = new java.util.ArrayList();
}
public static void main(String[] args) {
try {
readFromFile();
Object testCaseObject = buildTestCaseObject();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void readFromFile() {
// read data from file and put them into dataLines.
}
private void buildTestCaseObject() throws Exception {
int length = dataLines.size();
for (int i = 0; i < dataLines; i++) {
// Use StringTokenizer to parse string.
String property = "";
int type = INT;
String value = "";
java.util.StringTokenizer tokenizer =
new java.util.StringTokenizer((String)dataLines.get(i), ",");
int item = 0;
while (tokenizer.hasMoreElement()) {
if (item == 0) {
property = tokenizer.nextElement();
}
if (item == 1) {
String s = tokenizer.nextElement();
type = Integer.parseInt(s);
}
if (item == 2) {
value = Integer.parseInt(s);
}
}
switch (type) {
case INT: builder.buildInt(property, value);
break;
case LONG: builder.buildLong(property, value);
break;
case FLOAT: builder.buildFloat(property, value);
break;
case DOUBLE: builder.buildDouble(property, value);
break;
case CHAR: builder.buildChar(property, value);
break;
case STRING: builder.buildString(property, value);
break;
default: throw Exception("Invalid type.");
}
}
return builder.getProduct();
}
}
具体生成器TestCaseBuilder创建TestCaseObject的各个部分。
// TestCaseBuilder.java
/**
* This class is used to build a TestCaseObject.
*/
public class TestCaseBuilder extends Builder {
TestCaseObject obj;
public TestCaseBuilder() {
obj = new TestCaseObject();
}
public Object getProduct() {
return obj;
}
public void buildInt(String property, String value) {
// Use reflection to get the property name.
try {
java.lang.reflect.Field f = Class.forName("TestCaseObject").getField(property);
f.setInt(obj, Integer.parseInt(value);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void buildLong(String property, String value) {
// Use reflection to get the property name.
try {
java.lang.reflect.Field f = Class.forName("TestCaseObject").getField(property);
f.setInt(obj, Long.parseLong(value);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void buildLong(String property, String value) {
......
}
}
抽象生成器Builder定义了生成对象每个部分的方法。
// Builder.java
/**
* This is a abstract class defined methods to build parts of a product.
*/
public abstract class Builder {
public Builder() {
}
public Object getProduct() {
return null;
}
public void buildInt(String property, String value) {
}
public void buildLong(String property, String value) {
}
......
}
// TestCaseObject.java
/**
* Product class.
*/
public class TestCaseObject {
public int i;
public long l;
public String s;
}
这个简单的例子演示了如何使用Builder模式,实际的应用可能会比较复杂,但无论如何,在创建复杂的对象并且想重用创建过程时,可以考虑使用Builder模式。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -