Builder Design [싱글톤 디자인]

  1. Design Object [디자인목적]

    1. 같은 객체생성 프로세스를 공유하는 여러 다른 객체를 생성할 필요가 있을 때 적용.
    2. 예를 들어, 하나의 조건으로 NoSQL, Oracle SQL을 작성해야 할 때 적용.
  2. Options [대안들]

    1. 각 기능별로 별도의 오브젝트 선언

      -> 확장성이 떨어지며, 기능이 추가되거나 변경 시 시스템 전반적으로 수정해야한다.

  3. Benefit [디자인 장점]

    1. 하나의 builder를 통해 하위 객체들을 컨트롤 가능

    2. 빌더가 객체를 생성하여 줌으로, 시스템 유지보수 용이

  4. Structure & Sample Code [구조와 샘플코드]

    1) 쿼리를 담을 DO[DataObject] 선언

    1. UML

      QueryBuilderDirector : 실질적으로 클라이언트에서 제어하는 호출 하는 부분이며, Builder들을 제어하여, 쿼리 생성.
      QueryBuilder : 각 객체를 만들어서 제공하는 역할
      Query : 각 구현객체의 인터페이스 이며, 구현을 통해 추가되는 객체의 생성이 용이

    2. 구조
      -> 인터페이스를 선언하여, 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();

    }

}

results matching ""

    No results matching ""