시냅스

앱스트랙트 팩토리 패턴 Java로 구현 본문

디자인 패턴

앱스트랙트 팩토리 패턴 Java로 구현

ted k 2022. 8. 24. 14:28

Abstract Factory Pattern

  • 여러 제품굼을 하나의 Set으로 생성하는 패턴
  • 구체적인 클래스를 생성하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공한다.
  • 추상화된 인터페이스 팩토리를 제공하고 상황에 따라 그에 맞는 인스턴스들이 생성되도록 한다.
  • 생성되고 구성되고 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
  • 하나 이상의 제품군들 중 하나를 선택하여 시스템을 설정해야 하고 한 번 구성한 제품을 다른 것으로 대체할 수 있을 때

 

  • AbstractFactory
    • 개념적 제품에 대한 객체를 생성하는 오퍼레이션 인터페이스를 정의한다.
  • ConcreteFactory
    • 구체적인 제품에 대한 객체를 생성하는 오퍼레이션을 구현한다.
  • AbstractProduct
    • 개념적 제품에 대한 객체를 생성하는 오퍼레이션을 구현한다.
  • ConcreteProduct
    • 구체적으로 팩토리가 생성할 객체를 정의하고, AbstractProduct가 정의하고 있는 인터페이스를 구현한다.
  • Client
    • AbstractFactory와 AbstractProduct 클래스에 선언된 인터페이스를 사용한다.

 

결론

  • 일반적으로 ConcreteFactroy 클래스의 인스턴스는 실행할 때 만들어진다.
  • 구체적 팩토리는 어떤 특정 구현을 갖는 제품 객체를 생성한다. 서로 다른 제품 객체를 생성하기 위해서 사용자는 서로 다른 ConcreteFactory를 사용한다.
  • AbstractFactory는 ConcreteFactory 서브 클래스를 통해 필요한 제품 객체를 생성하는 책임을 위임한다.

 

구현

package abstractfactory;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

class UserInfo {
    private String userId;
    private String passwd;
    private String userName;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

class Product {
    private String productId;
    private String productName;

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}

abstract class DaoFactory {
    public abstract UserInfoDao createUserInfoDao();
    public abstract ProductDao createProductDao();
}

class MySqlDaoFactory extends DaoFactory{
    @Override
    public UserInfoDao createUserInfoDao() {
        return new UserInfoMySqlDao();
    }
    @Override
    public ProductDao createProductDao() {
        return new ProductMySqlDao();
    }
}

class OracleDaoFactory extends DaoFactory{
    @Override
    public UserInfoDao createUserInfoDao() {
        return new UserInfoOracleDao();
    }
    @Override
    public ProductDao createProductDao() {
        return new ProductOracleDao();
    }
}

abstract class UserInfoDao {
    public abstract void insertUserInfo(UserInfo user);
    public abstract void updateUserInfo(UserInfo user);
    public abstract void deleteUserInfo(UserInfo user);
}

class UserInfoMySqlDao extends UserInfoDao {

    @Override
    public void insertUserInfo(UserInfo user) {
        System.out.println("insert MySql info");
    }

    @Override
    public void updateUserInfo(UserInfo user) {
        System.out.println("update MySql info");
    }

    @Override
    public void deleteUserInfo(UserInfo user) {
        System.out.println("delete MySql info");
    }
}

class UserInfoOracleDao extends UserInfoDao {

    @Override
    public void insertUserInfo(UserInfo user) {
        System.out.println("insert oracle info");
    }

    @Override
    public void updateUserInfo(UserInfo user) {
        System.out.println("update oracle info");
    }

    @Override
    public void deleteUserInfo(UserInfo user) {
        System.out.println("delete oracle info");
    }
}

abstract class ProductDao {
    abstract public void insertProduct(Product product);
    abstract public void updateProduct(Product product);
    abstract public void deleteProduct(Product product);
}

class ProductMySqlDao extends ProductDao {

    @Override
    public void insertProduct(Product product) {
        System.out.println("insert MySql product");
    }

    @Override
    public void updateProduct(Product product) {
        System.out.println("update MySql product");
    }

    @Override
    public void deleteProduct(Product product) {
        System.out.println("delete MySql product");
    }
}

class ProductOracleDao extends ProductDao {

    @Override
    public void insertProduct(Product product) {
        System.out.println("insert Oracle product");
    }

    @Override
    public void updateProduct(Product product) {
        System.out.println("update Oracle product");
    }

    @Override
    public void deleteProduct(Product product) {
        System.out.println("delete Oracle product");
    }
}

public class AbstractFactoryImpl {
    public static void main(String[] args) throws IOException {
//        FileInputStream fis = new FileInputStream("absolute path");
//        Properties prop = new Properties();
//        prop.load(fis);
//        String dbType = prop.getProperty("DBTYPE");
        String dbType = "MYSQL";
        UserInfo userInfo = new UserInfo();
        userInfo.setUserId("12345");
        userInfo.setPasswd("!@#$%");
        userInfo.setUserName("Tomas");

        Product product = new Product();
        product.setProductId("0011AA");
        product.setProductName("TV");

        DaoFactory daoFactory = null;
        UserInfoDao userInfoDao = null;
        ProductDao productDao = null;

        if(dbType.equals("ORACLE")){
            daoFactory = new OracleDaoFactory();
        }
        else if(dbType.endsWith("MYSQL")){
            daoFactory = new MySqlDaoFactory();
        }
        else{
            System.out.println("db support error");
            return;
        }
        userInfoDao = daoFactory.createUserInfoDao();
        productDao = daoFactory.createProductDao();
        System.out.println("==USERINFO TRANSACTION==");
        userInfoDao.insertUserInfo(userInfo);
        userInfoDao.updateUserInfo(userInfo);
        userInfoDao.deleteUserInfo(userInfo);
        System.out.println("==PRODUCT TRANSACTION==");
        productDao.insertProduct(product);
        productDao.updateProduct(product);
        productDao.deleteProduct(product);
    }
}

 

Comments