# 설명
구체적인 클래스를 생성하지 않고, 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 추상팩토리로 제공함.
하나 이상의 제품군들 중 하나를 선택하여 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을때
## 예시
- 두개의 도메인(product, userInfo)으로 나뉜 서비스가 있다.
- 각 도메인에서는 MySQL과 Oracle 두개의 DB를 제공한다.
- product와 userInfo는 MySQL에 저장되거나, 또는 Oracle에 저장 돼야한다.
- 추상팩토리를 이용해 한번에 군(MySQL 또는 Oracle)를 관리 할 수 있도록 해준다.
Client(사용자)는 DaoFactory만을 이용해서 각 도메인의 DB(MySQL 또는 Oracle)을 사용할 수 있다.
# 코드
## Product 도메인
// ProductDao
package abstractFactory.domain.product.dao;
public interface ProductDao {
void insertProduct(Product p);
void updateProduct(Product p);
void deleteProduct(Product p);
}
// ProductOracleDao
package abstractFactory.domain.product.dao.oracle;
public class ProductOracleDao implements ProductDao {
@Override
public void insertProduct(Product p) {
System.out.println("Insert Into Oracle DB, productId : "+ p.getProductId());
}
@Override
public void updateProduct(Product p) {
System.out.println("update Into Oracle DB, productId : "+ p.getProductId());
}
@Override
public void deleteProduct(Product p) {
System.out.println("delete from Oracle DB, productId : "+ p.getProductId());
}
}
// ProductMySqlDao
package abstractFactory.domain.product.dao.mysql;
public class ProductMySqlDao implements ProductDao {
@Override
public void insertProduct(Product p) {
System.out.println("Insert Into MySQL DB, productId : "+ p.getProductId());
}
@Override
public void updateProduct(Product p) {
System.out.println("update Into MySQL DB, productId : "+ p.getProductId());
}
@Override
public void deleteProduct(Product p) {
System.out.println("delete from MySQL DB, productId : "+ p.getProductId());
}
}
## UserInfo 도메인
// UserInfoDao
package abstractFactory.domain.userInfo.dao;
import abstractFactory.domain.userInfo.UserInfo;
public interface UserInfoDao {
void inserUserInfo(UserInfo u);
void updateUserInfo(UserInfo u);
void deleteUserInfo(UserInfo u);
}
// UserInfoOracleDao
package abstractFactory.domain.userInfo.dao.oracle;
public class UserInfoOracleDao implements UserInfoDao {
@Override
public void inserUserInfo(UserInfo u) {
System.out.println("Insert Into Oracle DB, UserId : "+ u.getUserId());
}
@Override
public void updateUserInfo(UserInfo u) {
System.out.println("update Into Oracle DB, UserId : "+ u.getUserId());
}
@Override
public void deleteUserInfo(UserInfo u) {
System.out.println("delete from Oracle DB, UserId : "+ u.getUserId());
}
}
// UserInfoMySqlDao
package abstractFactory.domain.userInfo.dao.mysql;
public class UserInfoMySqlDao implements UserInfoDao {
@Override
public void inserUserInfo(UserInfo u) {
System.out.println("Insert Into MySQL DB, UserId : "+ u.getUserId());
}
@Override
public void updateUserInfo(UserInfo u) {
System.out.println("update Into MySQL DB, UserId : "+ u.getUserId());
}
@Override
public void deleteUserInfo(UserInfo u) {
System.out.println("delete from MySQL DB, UserId : "+ u.getUserId());
}
}
## factory
// DaoFactory
package abstractFactory.factory;
public interface DaoFactory {
ProductDao createProductDao();
UserInfoDao createUserInfoDao();
}
// OracleDaoFactory
package abstractFactory.factory;
public class OracleDaoFactory implements DaoFactory{
@Override
public ProductDao createProductDao() {
return new ProductOracleDao();
}
@Override
public UserInfoDao createUserInfoDao() {
return new UserInfoOracleDao();
}
}
// MySqlDaoFactory
package abstractFactory.factory;
public class MySqlDaoFactory implements DaoFactory{
@Override
public ProductDao createProductDao() {
return new ProductMySqlDao();
}
@Override
public UserInfoDao createUserInfoDao() {
return new UserInfoMySqlDao();
}
}
## Client
// MyClient
package abstractFactory.client;
public class MyClient {
public static void main(String[] args) {
String input;
DaoFactory factory;
Scanner scan = new Scanner(System.in);
System.out.println("MySQL과 Oracle 중 선택해주세요. >> ");
input = scan.nextLine();
System.out.println("선택한 데이터베이스 : " + input);
factory = null;
if ( input.equals("MySQL")) {
factory = new MySqlDaoFactory();
} else if( input.equals("Oracle")) {
factory = new OracleDaoFactory();
} else {
System.out.println("잘못된 입력입니다.");
System.exit(0);
}
ProductDao productDao = factory.createProductDao();
UserInfoDao userInfoDao = factory.createUserInfoDao();
// 새로운 데이터 생성 후 삽입하기
productDao.insertProduct(new Product("새우깡","000001"));
userInfoDao.inserUserInfo(new UserInfo("김호준","test1234","pwd1234"));
}
}
# 결과
하나씩 DAO를 재설정해주지 않고, 마치 DB를 갈아끼우는거와 같은 효과의 결과를 얻을 수 있었다.
DaoFactory로 구성을 변경하는 것이다.
# 마치며
인터페이스로 행동의 정의하고 상속받아 사용함으로써 다형성을 누릴 수 있었다.
다형성은 OOP의 막강한 기능이라고 느낀다.
'• 독서 > Design Pattern' 카테고리의 다른 글
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern) (2) | 2022.09.20 |
---|---|
[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method) (0) | 2022.09.18 |
[디자인패턴-생성패턴] 빌더 패턴(Builder Pattern) (2) | 2022.09.17 |
[디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern) (0) | 2022.09.16 |
[디자인패턴-생성패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2022.09.16 |