@PheonixHkbxoic
2017-04-11T09:22:26.000000Z
字数 2017
阅读 1093
设计模式
如何创建对象?
1.构造方法(参数多的话需要很多构造方法)
2.setter方法(很方便,但对象会产生不一致的状态)
3.Builder模式
优点:独特的链式操作,简洁,方便
缺点:增加代码复杂度,产生冗杂,在项目中不可大量使用
package com.jtv.app.common;
/**
* 使用构造者模式创建AST(抽象语法树)对象
* @author PheonixHkbxoic
* @date 2017-4-10 下午06:43:00
*
*/
public class AST{
private final String keyword; //关键字 private String等
private final String varchar; //变量
private final String operation; //操作符=+-*{}[]/等
private final String struct; //结构if,switch,while,for等
public String getKeyword() {
return keyword;
}
public String getVarchar() {
return varchar;
}
public String getOperation() {
return operation;
}
public String getStruct() {
return struct;
}
private AST(Builder builder) {
this.keyword = builder.keyword;
this.varchar = builder.varchar;
this.operation = builder.operation;
this.struct = builder.struct;
}
//关键字列表
private static String[] keywords = new String[]{
"private","protect","public",
"final","String","int","float"
};
//关键字是否包含在关键字列表中
private static boolean contain(String keyword,String[] keywords){
boolean doContain = false;
for (int i = 0; i < keywords.length; i++) {
if(keywords[i].equalsIgnoreCase(keyword)){
doContain = true;
break;
}
}
return doContain;
}
//构造者模式中的构造者
public static class Builder{
private final String keyword;//必须
private final String varchar;//必须
private String operation;
private String struct;
public Builder(String keyword,String varchar) {
this.keyword = keyword;
this.varchar = varchar;
}
public Builder setOperation(String operation){
this.operation = operation;
return this;
}
public Builder setStruct(String struct){
this.struct = struct;
return this;
}
public AST build(){
//由于Builder是非线程安全的,所以如果要在Builder内部类中检查一个参数的合法性,必需要在对象创建完成之后再检查。
AST ast = new AST(this);
if(!contain(ast.getKeyword(),keywords)){
new Throwable("非法关键字!");
}
return ast;
}
}
}
//调用
AST ast = new AST.Builder("String","str")
.setOperation("=")
.setStruct("[]")
.build();
User类的构造方法是私有的。也就是说调用者不能直接创建User对象。
User类的属性都是不可变的。所有的属性都添加了final修饰符,并且在构造方法中设置了值。并且,对外只提供getters方法。
Builder模式使用了链式调用。可读性更佳。
Builder的内部类构造方法中只接收必传的参数,并且该必传的参数适用了final修饰符。相比于前面两种方法,Builder模式拥有其所有的优点,而没有上述方法中的缺点。客户端的代码更容易写,并且更重要的是,可读性非常好。唯一可能存在的问题就是会产生多余的Builder对象,消耗内存。然而大多数情况下我们的Builder内部类使用的是静态修饰的(static),所以这个问题也没多大关系。