1. 팩토리 패턴이란?
팩토리 패턴(Factory Pattern)은 객체 생성의 방법을 추상화하여 클라이언트 코드에서 객체 생성 과정을 분리하는 디자인 패턴이다. 이 패턴은 객체 생성의 로직을 캡슐화하여 클라이언트 코드가 객체 생성 방법에 종속되지 않도록 한다. 주로 객체 생성을 관리하고, 코드의 유연성과 확장성을 높이기 위해 사용된다.
package ex07.lib; public class MariaDB{ private String path; // sql 쿼리 전송, 1은 성공 -1 은 실패 public int excute(String sql){ if(path==null){ System.out.println("path : null point error"); } if(sql.equals("select")){ System.out.println("query excute: " +path+"/"+sql); return 1; }else { System.out.println("query fail : syntax error"); } return -1 ; } //dbms 서버 ip 찾기 public void setPath(String path){ this.path = path; } }
package ex07.lib; public class OracleDB{ private String url; // sql 쿼리 전송, 1은 성공 -1 은 실패 public int excute(String sql){ if(sql.equals("select")){ System.out.println("query excute: " +url+"/"+sql); return 1; }else { System.out.println("query fail : syntax error"); } return -1 ; } //dbms 서버 ip 찾기 public void setUrl(String url){ this.url = url; } }
package ex07; import ex07.lib.MariaDB; import ex07.lib.OracleDB; public class App { public static void main(String[] args) { MariaDB mariaDB = new MariaDB(); mariaDB.setPath("jdbc:mariadb://127.0.0.1:3306"); mariaDB.excute("select"); OracleDB oracleDB = new OracleDB(); oracleDB.setUrl("jdbc:oracle:thin://127.0.0.1:8080"); oracleDB.excute("select"); } }
2. 팩토리 메서드 구현하기
MariaDB와 OracleDB 간 메서드명이 다르기 때문에 인터페이스를 만들어 통일한다.
package ex07.lib; public interface DB { void setUrl(String url); int excute(String sql); }
package ex07.lib; public class MariaDB implements DB{ private String path; // sql 쿼리 전송, 1은 성공 -1 은 실패 public int excute(String sql){ if(path==null){ System.out.println("path : null point error"); } if(sql.equals("select")){ System.out.println("query excute: " +path+"/"+sql); return 1; }else { System.out.println("query fail : syntax error"); } return -1 ; } @Override public void setUrl(String url) { this.path = url; } }
package ex07.lib; public class OracleDB implements DB{ private String url; // sql 쿼리 전송, 1은 성공 -1 은 실패 public int excute(String sql){ if(sql.equals("select")){ System.out.println("query excute: " +url+"/"+sql); return 1; }else { System.out.println("query fail : syntax error"); } return -1 ; } //dbms 서버 ip 찾기 public void setUrl(String url){ this.url = url; } }
각 클래스는 인터페이스인 DB를 구현해 메서드 명을 통일한다.
팩토리 클래스
package ex07; import ex07.lib.DB; import ex07.lib.MariaDB; import ex07.lib.OracleDB; public class DBFactory { private static DBFactory instance = new DBFactory(); private DBFactory() {}; public static DBFactory getInstance() { return instance; } //팩토리 메서드 public DB createDB(String protocol) { // maria,oracle, mysql, mssql if (protocol.equals("maria")) { MariaDB mariaDB = new MariaDB(); mariaDB.setUrl("jdbc:mariadb://127.0.0.1:3306"); return mariaDB; } else if (protocol.equals("oracle")) { OracleDB oracleDB = new OracleDB(); oracleDB.setUrl("jdbc:oracle:thin://127.0.0.1:8080"); return oracleDB; }else { throw new NullPointerException("db driver not found exception"); } } }
팩토리 클래스를 만든다. 팩토리 클래스는 싱글톤 형태로 만든다.
그리고 팩토리 메서드에 실행 코드를 넣고 클라이언트는 매개변수만 넣으면 될 수 있도록 만든다.
package ex07; import ex07.lib.DB; public class App { public static void main(String[] args) { DBFactory factory = DBFactory.getInstance(); DB mariaDB = factory.createDB("maria"); // DB, MaraiDB mariaDB.excute("select"); DB oracleDB = factory.createDB("oracle"); // DB, MaraiDB oracleDB.excute("select"); } }
팩토리 패턴은 생성 패턴으로 메모리에 객체를 대신 띄워준다. 팩토리 패턴의 단점은 새로운 게 추가될 때 마다 기존 코드가 수정되어 OCP 를 위반하게 된다.
팩토리 패턴을 대신해 리플렉션을 사용하면 기존 코드를 수정하지 않아 OCP 를 위반하지 않지만 코드 전체를 분석하기 때문에 성능 저하가 발생한다.
따라서 상황에 맞게 사용하면 된다.
Share article