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