Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- http
- 스프링 핵심 원리
- kotlin
- Android
- db
- 김영한
- JDBC
- jpa
- springdatajpa
- Exception
- pointcut
- 백준
- 스프링 핵심 기능
- Thymeleaf
- AOP
- 자바
- 스프링
- Greedy
- java
- Servlet
- JPQL
- spring
- transaction
- 알고리즘
- SpringBoot
- Spring Boot
- Proxy
- 그리디
- 인프런
- QueryDSL
Archives
- Today
- Total
개발자되기 프로젝트
인스턴스 생성 패턴 - Abstract Factory Pattern 본문
1.Abstract Factory Pattern ?
- 여러 제품군(set)을 한꺼번에 생성하는 패턴
- 마지 공장마냥 instance set를 생성.
2. 의도(intent), 동기(motivation)
- 구체적인 클래스를 생성하지 않고도, 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한
인터페이스 제공 - 추상화된 인터페이스 팩토리를 제공하고, 상황에 다라 그에 맞는 인스턴스들이 생성되도록 함.
- 가령 데이터베이스에 따라 DAO클래스가 달라져야 한다고 할 때, 현재 사용해야 하는 DB종류에 따른
DAO인스턴스를 한꺼번에 생성하도록 한다. - 위젯을 생성하여 보여줄 때 선택한 옵션에 따라 위젯의 set이 달라질 수 있도록 한다.
- 가령 데이터베이스에 따라 DAO클래스가 달라져야 한다고 할 때, 현재 사용해야 하는 DB종류에 따른
- 생성되고 구성되고 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 하나 이상의 제품군들 중 하나를 선택하여 시스템을 설정해야 하고 한 번 구성한 제품을 다른 것으로
대체할 수 있을 때.
3. Class DIagram
4. 객체 협력 (collaborations)
- AbstractFactory
- 개념적 제품에 대한 객체를 생성하는 오퍼레이션 인터페이스를 정의한다
- ConcreteFactory
- 구체적인 제품에 대한 객체를 생성하는 오퍼레이션을 구현한다.
- AbstractProduct
- 개념적 제품 객체에 대한 인터페이스를 정의한다.
- ConcreteProduct
- 구체적으로 팩토리가 생성할 객체를 정의하고, AbstractProduct 가 정의하고 있는 인터페이스를 구현한다.
- Client
- AbstractFactory 와 AbstractProduct 클래스에 선언된 인터페이스를 사용한다.
5. 중요한 결론 (consequence)
- 일반적으로 ConcreteFactory 클래스의 인스턴스는 실행 할 때 만들어진다.
- 구체적 팩토리는 어떤 특정 구현을 갖는 제품 객체를 생성한다. 서로 다른 제품 객체를 생성하기 위해서
사용자는 서로 다른 ConcretetFactory 를 사용한다. - AbstractFactory 는 ConcreteFactory 서브클래스를 통해 필요한 제품 객체를 생성하는 책임을 위임한다.
6. 예제
public interface ProductDao {
void addProduct(Product product);
void removeProduct(Product product);
void updateProduct(Product product);
}
public interface UserInfoDao {
void addUser(User user);
void removeUser(User user);
void updateUser(User user);
}
public interface DaoFactory {
UserInfoDao createUserInfoDao();
ProductDao createProductDao();
}
- 파일에서 DBTYPE=value 값 불어와서 값에 맞게 동적으로 DB 에 맞는 factory 지정.
- Properties 클래스 : 파일에서 읽은 자료가 key=value인 경우 key, value 쌍으로 변경해서 가지고있음.
public class Test {
public static void main(String[] args) throws IOException {
DaoFactory factory = null;
FileInputStream fis = new FileInputStream("db.properties");
Properties properties = new Properties();
properties.load(fis);
String dbtype = properties.getProperty("DBTYPE");
//USER 생성
User user = new User("userA", 20);
//product 생성
Product product = new Product("product", 10);
//factory 생성
if (dbtype.equals("MYSQL")){
factory = new MySqlDaoFactory();
}else if (dbtype.equals("ORACLE")){
factory = new OracleDaoFactory();
}else {
System.out.println("error........");
}
UserInfoDao userInfoDao = factory.createUserInfoDao();
ProductDao productDao = factory.createProductDao();
userInfoDao.addUser(user);
userInfoDao.removeUser(user);
userInfoDao.updateUser(user);
productDao.addProduct(product);
productDao.removeProduct(product);
productDao.updateProduct(product);
}
}
- DBTYPE=ORACLE인 경우
add user to Oracle
remove user from Oracle
update user to Oracle
add product to Oracle
remove product from Oracle
update product to Oracle
- DBTYPE=MYSQL인 경우
add user to MySQL
remove user from MySQL
update user to MySQL
add product to MySQL
remove product from MySQL
update product to MySql
- 파일에 입력한 값에 따라 동적으로 FACTORY가 선택된다.
7. GitHub : 211104 Aspect Factory Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
하위 클래스 위임 - Template Method (0) | 2021.11.07 |
---|---|
인스턴스 생성 패턴 - Builder Pattern (0) | 2021.11.06 |
인스턴스 생성 패턴 - Prototype Pattern (0) | 2021.11.04 |
인스턴스 생성 패턴 - Singleton Pattern (0) | 2021.11.04 |
클래스 다이어그램 (0) | 2021.11.04 |
Comments