Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

인스턴스 생성 패턴 - Abstract Factory Pattern 본문

Java/디자인 패턴

인스턴스 생성 패턴 - Abstract Factory Pattern

Seung__ 2021. 11. 4. 23:55

1.Abstract Factory Pattern ?


  • 여러 제품군(set)을 한꺼번에 생성하는 패턴
  • 마지 공장마냥 instance set를 생성.

 

2. 의도(intent), 동기(motivation)


  • 구체적인 클래스를 생성하지 않고도, 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한
    인터페이스 제공
  • 추상화된 인터페이스 팩토리를 제공하고, 상황에 다라 그에 맞는 인스턴스들이 생성되도록 함.
    • 가령 데이터베이스에 따라 DAO클래스가 달라져야 한다고 할 때, 현재 사용해야 하는 DB종류에 따른
      DAO인스턴스를 한꺼번에 생성하도록 한다.
    • 위젯을 생성하여 보여줄 때 선택한 옵션에 따라 위젯의 set이 달라질 수 있도록 한다.
  • 생성되고 구성되고 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
  • 하나 이상의 제품군들 중 하나를 선택하여 시스템을 설정해야 하고 한 번 구성한 제품을 다른 것으로
    대체할 수 있을 때.

 

 

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


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

Comments