[CS] 팩토리 패턴(factory pattern)CS/CS2022. 9. 20. 21:55
Table of Contents
팩토리 패턴(factory pattern)이란?
- 상속관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정, 하위 클래스가 객체 생성에 관한 구체적인 내용을 결정하는 패턴
- 즉, 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴
- 상위 클래스와 하위 클래스가 분리되어있음
ㄴ결합이 느슨함.
ㄴ 상위 클래스의 유연성 증가 : 상위클래스가 인스턴스의 생성 방식에 대해 알 필요가 없기 때문.
ㄴ 유지보수성 증가(코드를 리팩터링 하더라도 한 곳만 고치면 됨) : 객체 생성 로직이 따로 떨어져있기 때문.
1. 자바스크립트의 팩토리 패턴
- new Object()로 구현 가능.
ㄴ 숫자를 전달하거나 문자열을 전달함에 따라 다른 타입의 객체를 생성함.
즉, 전달받은 값에 따라 다른 객체를 생성하며, 인스턴스의 타입 등을 결정.
const num = new Object(42)
const str = new Object('a')
console.log(num.constructor.name + ' and ' + str.constructor.name)
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "Espresso"
}
}
//하위 클래스1
class LatteFactory {
static createCoffee() {
return new Latte()
}
//하위 클래스2
class EspressoFactory {
static createCoffee() {
return new Espresso()
}
const factoryList = {LatteFactory, EspressoFactory }
//상위 클래스
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
const main = () => {
//라테 커피 주문
const coffee = CoffeeFactory.createCoffrr("LatteFactory")
//커피 이름 부르기
console.log(coffee.name) //latte
}
main()
더보기
static createCoffee처럼 정적 메서드를 사용하면, 클래스의 인스턴스 없이 호출이 가능해 메모리를 절양 할 수 있고, 개별 인스턴스에 묶이지 않으며, 클래스 내의 함수를 정의 할 수 있음.
2. 자바의 팩토리 패턴
abstract class Coffee {
public abstract int getPrice();
@Override
public String toString() {
return "hi this coffee is " + this.getPrice();
}
}
class CoffeeFactory {
public static Coffee getCoffee(String type, int price) {
if ("Latte".equalsIgnoreCase(type)) return new Latte(price);
else if ("Americano".equalsIgnoreCase(type)) return new Americano(price);
else {
return new DefaultCoffee();
}
}
}
class DefaultCoffee extends Coffee {
private int price;
public DefaultCoffee() {
this.price = -1;
}
@Override
public int getPrice() {
return this.price;
}
}
class Latte extends Coffee {
private int price;
public Latte(int price) {
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
class Americano extends Coffee {
private int price;
public Americano(int price) {
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
public class HelloWorld {
public static void main(String[] args) {
Coffee latte = CoffeeFactory.getCoffee("Latte",4000);
Coffee ame = CoffeeFactory.getCoffee("Americano",3000);
System.out.println("Factory latte :: " +latte);
System.out.println("Factory latte :: " +ame);
}
}
//Factory latte :: hi this coffee is 4000
//Factory ame :: hi this coffee is 3000
'CS > CS' 카테고리의 다른 글
[CS] 이터레이터 패턴(iterator pattern) (0) | 2022.09.20 |
---|---|
[CS] 프로그래밍 패러다임(Programming paradigm) (0) | 2022.09.20 |
[CS] 디자인 패턴이란? (0) | 2022.09.20 |
[CS] 캐시(Cache)란? (0) | 2021.12.12 |
[CS] 컴파일러(Compiler)란? (0) | 2021.12.12 |
@Yanako :: Yana's coding story였는데요, 우당탕탕 개발일지가 맞는것같
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!