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 |
Tags
- 원격저장소
- MVC
- GitHub
- gitbash
- Git
- 스프링프레임워크
- 팀과제
- springmvc
- springboot
- securityconfig
- springframeworkruntime
- DispatcherServlet
- assume True
- Junit5
- Spring
- swaggerUrl
- assume That
- .out
- 부스트코스
- .idea
- 파일삭제
- 컴퓨터과학
- springsecurity
- CS50
- assuming That
- c언어
- MVC모듈
- Swagger
- assume
- container
Archives
- Today
- Total
도담이 먹여 살려야하는 집사
Factory-Method Pattern 본문
객체를 생성하는 인터페이스를 미리 정의하고 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스에서 이루어지도록 하는 패턴
즉 부모(상위)클래스에서 미리정하고 자식(하위)클래스에서 결정 (객체 생성을 대신 수행해주는 공장이라고 생각 하기)
서브클래스에 인스턴스 결정 및 책임을 위임하는 패턴으로 Abstract Factory 와 Template Method 패턴에 활용할 수 있음.
서브 클래스에 대한 hook(객체별로 서로 다른 버전을 제공하는 기능) 메소드를 제공하는 패턴이다.
장점
직접 객체를 생성하는 것이 아니라 객체만 생성하는 factory를 만들어서 객체 생성을 중간 매개체인 공장에 불러오는 것
객체들은 한 공장에서만 생성되기 때문에 객체들을 한곳에서 관리할 수 있고 객체의 생명주기를 관리하기 쉬워짐.
동일한 인터페이스에서 구현되기때문에 새로운 클래스가 추가되거나 확장하게되어도 기존 소스코드를 변경할 필요없니 하위클래스를 만들면 되기때문에 새로운 객체를 생성하는 것 보다 유연하고 확장성 있는 구조가 됨.
프로그램 내에서 동일한 객체의 호출이 잦고 객체를 생성하는 비용이 클 경우 객체를 반복하여 반환하여 사용할 경우 성능을 높일 수 있음
생성자가 아닌 메소드로 작동 -> 리턴값을 가질 수 있음 -> 리턴값으로 상황에 따라서 서로 다른 객체를 반환할 수 있다는 뜻
리턴 값으로 상황에 따라서 서로 다른 객체를 반환 할 수 있다는 뜻
단점
계속해서 하위클래스를 정의하기때문에 불필요하게 많은 클래스를 정의 하게되어 복잡해질 수 있다는 점
package FrameWork;
public abstract class ProductCreator {
public Product create() {
Product product;
//step1
setProductInfo();
//step2
product = buyProduct();
//step3
manageProduct();
return product;
}
//판매자는 제품을 데이터베이스에 등록
abstract protected void setProductInfo();
//판매자는 제품에 대한 재고관리
abstract protected void manageProduct();
//구매자가 제품을 삼
abstract protected Product buyProduct();
}
package FrameWork;
public interface Product {
public void buy();
}
package Concrete;
import FrameWork.Product;
import FrameWork.ProductCreator;
public class TvProduct extends ProductCreator {
@Override
protected void setProductInfo() {
System.out.println("판매자가 Tv 정보를 입력했습니다.");
}
@Override
protected void manageProduct() {
System.out.println("Tv 재고관리 완료");
}
@Override
protected Product buyProduct() {
return new TV();
}
}
package Concrete;
import FrameWork.Product;
public class TV implements Product {
@Override
public void buy() {
System.out.println("구입 성공!");
}
}
package Concrete;
import FrameWork.Product;
import FrameWork.ProductCreator;
public class ProductMain {
public static void main(String[] args) {
ProductCreator creator;
Product product;
creator = new TvProduct();
product = creator.create();
product.buy();
}
}
클래스다이어그램 출처 johngrib.github.io/wiki/factory-method-pattern/
'Design Pattern' 카테고리의 다른 글
Abstract Factory Pattern (0) | 2020.09.03 |
---|---|
Template Method Pattern (0) | 2020.09.01 |
Design Pattern (0) | 2020.09.01 |
Comments