김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GitHubDesktop
  • 원격저장소
  • KMU_WINK
  • ㄱ
  • local저장소
  • Remote저장소
  • 깃허브데스크탑
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)
• 독서/Design Pattern

[디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)

2022. 9. 17. 02:08

# 설명

구체적인 클래스를 생성하지 않고, 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 추상팩토리로 제공함.

하나 이상의 제품군들 중 하나를 선택하여 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을때

## 예시

  1. 두개의 도메인(product, userInfo)으로 나뉜 서비스가 있다.
  2. 각 도메인에서는 MySQL과 Oracle 두개의 DB를 제공한다.
  3. product와 userInfo는 MySQL에 저장되거나, 또는 Oracle에 저장 돼야한다.
  4. 추상팩토리를 이용해 한번에 군(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
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)
    • [디자인패턴-생성패턴] 빌더 패턴(Builder Pattern)
    • [디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern)
    • [디자인패턴-생성패턴] 싱글톤 패턴(Singleton Pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바