Murayama blog.

プログラミングと、その次の話

ビルダー

GW最終日ということで、Effective Javaを読んでみました。

項目2 数多くのコンストラクタパラメータに直面した場合はビルダーを検討する

というのを見て、試しに何かのビルダーを作ってみたくなったので、何か作ってみました。

お題:SQLを実行するクラス的なもの。

package chapter1;

public class SQLCommand {

	String sql;

	public SQLCommand(Builder builder) {
		sql = builder.sb.toString();
	}

	public void execute() {
		System.out.println(sql);
	}

	private static class Builder {

		StringBuilder sb = new StringBuilder();

		public Builder select(String columns) {
			sb.append(" select " + columns);
			return this;
		}

		public Builder from(String table) {
			sb.append(" from " + table);
			return this;
		}

		public Builder where(String conditions) {
			sb.append(" where " + conditions);
			return this;
		}

		public Builder groupby(String columns) {
			sb.append(" group by " + columns);
			return this;
		}

		public Builder orderby(String columns) {
			sb.append(" order by " + columns);
			return this;
		}

		public SQLCommand build() {
			return new SQLCommand(this);
		}
	}

	public static void main(String[] args) {

		SQLCommand simpleCommand = new SQLCommand.Builder().select("*").from(
				"emp").build();
		simpleCommand.execute();

		SQLCommand complexCommand = new SQLCommand.Builder().select(
				"deptno, count(*)").from("emp").where("sal > 500").groupby(
				"deptno").orderby("deptNo").build();
		complexCommand.execute();
	}
}

実行結果

 select * from emp
 select deptno, count(*) from emp where sal > 500 group by deptno order by deptNo

まとめ

ビルダーは楽しい。