[3] 디자인 패턴 - 팩토리 패턴(Factory Pattern)

2023. 7. 22. 16:28cs및 소프트스킬/디자인 패턴

728x90
반응형
SMALL

1. 팩토리 패턴 (Factory Pattern)

- 생성 패턴 중 하나

- 객체 생성 부분을 떼어낸 추상화한 패턴, 

- 상위 클래스 : 뼈대 역할 // 하위 클래스 : 객체 생성에 관한 구체적 내용 결정

- 마치 제조 공장의 예시를 따지면, 상위 클래스 : 공장 / 하위클래스 : 레시피 라고 표현 가능

- 여기서 제목만 보여주는 행위를 표하고, 상세 내역은 숨겨주는 역할이 가능하다.

 

 

2. JS로 이용한 팩토리 패턴으로 이용한 제조 공장 구현

 

(1) 상위 클래스 : Factory

// 제조 공장에서 사용하는 레시피 설정
const factoryList = [CoffeeFactory, FoodFactory];

// 상위 메소드 : Factory
class Factory {
	static createMaterial(type) {
    	const factory = factoryList[type];
        // 제조 공장 클래스에서 리스트 클래스 사용
        // 의존성 주입 하여 설정
        return factory.createMaterial();
    }
}

 

(2) 하위 클래스1 : CoffeeFactory // Domain Class : Coffee <캡슐화1>

// 커피 클래스를 생성하여
// Coffee라고 알려준다.
class Coffee {
	constructor() {
    	this.name = "coffee"
    }
}

// 하위 클래스 CoffeeFactory 생성
// 여기서 Coffee 클래스를 생성하여 사용
class CoffeeFactory {
	static createMatrial() {
    	return new Coffee();
    }
}

 

 

(3) 하위 클래스2 : FoodFactory // Domain Class : Food <캡슐화2>

// 음식 클래스를 생성하여
// food라고 알려준다.
class Food {
	constructor() {
    	this.name = "food"
    }
}

// 하위 클래스 FoodFactory 생성
// 여기서 Food 클래스를 생성하여 사용
class FoodFactory {
	static createMatrial() {
    	return new Food();
    }
}

 

 

(4) 테스트

const test = () => {
	// 커피 공장을 불려봅니다.
    const coffee = Factory.createMatrial("CoffeeFactory");
    // Coffee 클래스에서의 대한 정보 중 하나인 커피 공장이라고 알려준다.
    console.log(coffee.name); 
    
    // 음식 공장을 불려봅니다.
    const food = Factory.createMatrial("FoodFactory");
    // Food 클래스에서의 대한 정보 중 하나인 음식 공장이라고 알려준다.
    console.log(food.name); 
}

 

 

 

 

3. Java로 이용한 팩토리 패턴으로 이용한 제조 공장 구현

(1) 상위 클래스 : MatrialFactory // 도메인 : Matrial

// 상위 메소드 : Matrial
abstract class Matrial {
	public abstract String getName();
    public abstract int getPrice();
    
    @Ovverride
    public String toString() {
    	return getName() + " 공장 입니다. \n 발주 가격 : " + this.getPrice();
    }
}

// Domain Matrial 설정 이후, 실질적 행위를 해주는 메소드 
class MatrialFactory {
	public Matrial getMatrial(String type, int price) {
    	// Coffee 공장 클래스 접근
    	if ("Coffee".equalsIgnoreCase(type)) return new Coffee(type, price)
        // Food 공장 클래스 접근
        else if ("Food".equalsIgnoreCase(type)) return new Food(type, price)
        // 아무것도 설정을 하지 않을 시
        else return null;
    }
}

 

 

2. 하위 클래스 : Coffee <캡슐화1>

class Coffee extends Matrial {
	// 변수 캡슐화
    private int price;
    
    public Coffee(String type, int price) {
    	this.type = type;
        this.price = price;
    }
    
    @Override
    public int getPrice() {
    	return this.price;
    }
    
    @Override
    public String getType() {
    	return this.type;
    }
}

 

 

3. 하위 클래스 : Food <캡슐화2>

class Food extends Matrial {
	// 변수 캡슐화
    private int price;
    
    public Coffee(String type, int price) {
    	this.type = type;
        this.price = price;
    }
    
    @Override
    public int getPrice() {
    	return this.price;
    }
    
    @Override
    public String getType() {
    	return this.type;
    }
}

 

 

(4) 테스트

public class test {
	public static void main (String[] args) {
    	Matrial coffee = MatrialFactory.getMatrial("Coffee", 100000);
        Matrial food = MatrialFactory.getMatrial("Food", 2000000);
        
        /*
        	Coffee 공장 입니다.
            발주 가격 : 100000
        */ 
        System.out.println(coffee);
        
        /*
        	Food 공장 입니다.
            발주 가격 : 2000000
        */ 
        System.out.println(food);
    }
}

 

 

 

728x90
반응형
LIST