Builder Design [싱글톤 디자인]
Design Object [디자인목적]
- 같은 객체생성 프로세스를 공유하는 여러 다른 객체를 생성할 필요가 있을 때 적용.
- 예를 들어, 하나의 조건으로 NoSQL, Oracle SQL을 작성해야 할 때 적용.
Options [대안들]
각 기능별로 별도의 오브젝트 선언
-> 확장성이 떨어지며, 기능이 추가되거나 변경 시 시스템 전반적으로 수정해야한다.
Benefit [디자인 장점]
하나의 builder를 통해 하위 객체들을 컨트롤 가능
빌더가 객체를 생성하여 줌으로, 시스템 유지보수 용이
Structure & Sample Code [구조와 샘플코드]
1) 쿼리를 담을 DO[DataObject] 선언
UML
QueryBuilderDirector : 실질적으로 클라이언트에서 제어하는 호출 하는 부분이며, Builder들을 제어하여, 쿼리 생성.
QueryBuilder : 각 객체를 만들어서 제공하는 역할
Query : 각 구현객체의 인터페이스 이며, 구현을 통해 추가되는 객체의 생성이 용이구조
-> 인터페이스를 선언하여, DO 확장성 을 가져감
1) interface
// DO의 인터페이스이며, 공통 기능을 정의.
// DO생성 시 인터페이스를 구현해야 하며, 이를 통해 기능의 통일성 획득 가능
public interface Query {
void execute();
}
implemented class
-> DO for mongodb query and Oracle sql
// Oracle SQL Query class
public class SqlQuery implements Query{ //Query interface 상속.
/**
* Query 작성을 위한 private 속성 정의
*/
private String from;
private String where;
@Override
public void execute() {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
System.out.println("Execute sql query. from : " + from +" where : "+where );
}
/**
* Setter
*/
public void setFrom(String from){
this.from = from;
}
public void setWhere(String where){
this.where = where;
}
}
//MongoDB query class
public class MongoDBQuery implements Query {
private String from;
private String where;
@Override
public void execute() {
System.out.println("Execute MongoDB Query, from : " + from +" , where : "+ where);
}
public void setFrom(String from){
this.from = from;
}
public void setWhere(String where){
this.where = where;
}
}
2\) DO를 생성하기 위한 Builder 인터페이스 생성
-> interface 선언 후 구현 클래스 생성
public interface QueryBuilder {
void from(String from); // Query의 from 생성
void where(String where); // Query의 where 생성
// 실제 생성된 쿼리 객체를 반환
Query getQuery();
}
-> Interface를 구현한 클래스 생성
// Oracle SQL를 만들기 위한 builder.
public class SqlQueryBuilder implements QueryBuilder{
private SqlQuery query = new SqlQuery();
@Override
public void from(String from) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
query.setFrom(from);
}
@Override
public void where(String where) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
query.setWhere(where);
}
@Override
public Query getQuery() {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
return query;
}
}
// MongoDB query를 만들기 위한 builder
public class MongoDBQueryBuilder implements QueryBuilder{
private MongoDBQuery query = new MongoDBQuery();
@Override
public void from(String from) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
query.setFrom(from);
}
@Override
public void where(String where) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
query.setWhere(where);
}
@Override
public Query getQuery() {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
return query;
}
}
3) builder를 제어할 Director 생성 <Create BuilderDirector to controll
public class QueryBuilderDirector {
/**
* Create query based on a from and a where
* Query builder defines end representation result.
*/
public Query buildQuery(String from, String where, QueryBuilder builder){
builder.from(from);
builder.where(where);
return builder.getQuery();
}
}
4) 사용방법 <How to use>
public class Client {
public static void main(String[] args) {
QueryBuilderDirector director = new QueryBuilderDirector(); //Builder를 제어할 director 선언
/**
* 공통 적용될 변수
*/
String from = "FROM TABLE A";
String where = "WHERE A = A";
// builder선언 -> 재사용
QueryBuilder builder = new SqlQueryBuilder();
// Oracle SQL 쿼리 빌딩
Query sqlQuery = director.buildQuery(from, where, builder);
sqlQuery.execute();
//mongodb 쿼리 빌딩
builder = new MongoDBQueryBuilder();
Query mongoQuery = director.buildQuery(from, where, builder);
mongoQuery.execute();
}
}