建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
用户只需要指定需要建造的类型就可以获得对象,建造过程和细节不需要了解。
例子:
package com.black.design.pattern.builder.sql;
import java.util.ArrayList;
import java.util.List;
// 查询规则类
public class QueryRule {
// 查询条件
private List<String> conditions = new ArrayList<String>();
// 排序字段
private List<String> orderConditions = new ArrayList<String>();
// 参数值
private List<Object> params = new ArrayList<Object>();
public QueryRule addAscOrder(String propertyName) {
orderConditions.add(propertyName + " asc");
return this;
}
public QueryRule addDescOrder(String propertyName, Object v) {
orderConditions.add(propertyName + " desc");
return this;
}
public QueryRule andLike(String propertyName, Object v) {
params.add("%"+v+"%");
conditions.add(propertyName + " like ");
return this;
}
public QueryRule andEquals(String propertyName, Object v) {
params.add(v);
conditions.add(propertyName + " = ");
return this;
}
public QueryRule andGreaterEquals(String propertyName, Object v) {
params.add(v);
conditions.add(propertyName + " >= ");
return this;
}
public List<String> getConditions() {
return conditions;
}
public List<String> getOrderConditions() {
return orderConditions;
}
public List<Object> getParams() {
return params;
}
}
package com.black.design.pattern.builder.sql;
import java.util.ArrayList;
import java.util.List;
// sql 构造器
public class QueryRuleSqlBuilder {
private QueryRule queryRule;
private List<Object> values = new ArrayList<Object>();
public QueryRuleSqlBuilder(QueryRule queryRule) {
this.queryRule = queryRule;
this.values = queryRule.getParams();
}
public String build(String tableName) {
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("select * from ").append(tableName);
List<String> conditions = queryRule.getConditions();
for (int i = 0; i < conditions.size(); i++) {
if(i==0) {
sqlBuffer.append(" where ");
}
sqlBuffer.append(conditions.get(i)).append("?");
if(i < conditions.size() - 1) {
sqlBuffer.append(" and ");
}
}
//排序
List<String> orders = queryRule.getOrderConditions();
for (int i = 0; i < orders.size(); i++) {
if(i==0) {
sqlBuffer.append(" order by ");
}
sqlBuffer.append(orders.get(i));
if(i < orders.size() - 1) {
sqlBuffer.append(",");
}
}
sqlBuffer.append(";");
return sqlBuffer.toString();
}
public List<Object> getValues() {
return values;
}
}
测试:
package com.black.design.pattern.builder.sql;
public class QueryRuleSqlBuilderTest {
public static void main(String[] args) {
QueryRule queryRule = new QueryRule();
queryRule.addAscOrder("age");
queryRule.andEquals("addr", "北京市");
queryRule.andLike("name", "black");
queryRule.andGreaterEquals("age", 18);
queryRule.andGreaterEquals("time", "2021-01-01");
QueryRuleSqlBuilder builder = new QueryRuleSqlBuilder(queryRule);
System.out.println(builder.build("t_user"));
System.out.println(builder.getValues());
}
}
输出:
select * from t_user where addr = ? and name like ? and age >= ? and time >= ? order by age asc;
[北京市, %black%, 18, 2021-01-01]