@PheonixHkbxoic
2017-04-11T01:22:26.000000Z
字数 2017
阅读 1196
设计模式
如何创建对象?
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),所以这个问题也没多大关系。