일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 파이썬
- Spring
- Kafka
- JPA
- MSA
- 알고리즘
- Java
- OS
- c언어
- Algorithm
- Data Structure
- react
- 자료구조
- 운영체제
- 디자인 패턴
- JavaScript
- mongoDB
- 컴퓨터구조
- IT
- spring webflux
- Proxy
- 자바
- Heap
- C
- 네트워크
- 백준
- MySQL
- redis
- design pattern
- Galera Cluster
Archives
- Today
- Total
시냅스
앱스트랙트 팩토리 패턴 Java로 구현 본문
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);
}
}
'디자인 패턴' 카테고리의 다른 글
메디에이터 패턴 Java로 구현 (0) | 2022.08.24 |
---|---|
브릿지 패턴 Java로 구현 (0) | 2022.08.24 |
이터레이터 패턴 Java로 구현 (0) | 2022.08.17 |
옵저버 패턴 Java로 구현 (0) | 2022.08.17 |
템플릿 메소드 패턴 Java로 구현 (0) | 2022.08.17 |
Comments