상세 컨텐츠

본문 제목

팩토리 패턴 (팩토리 메서드 패턴, 추상 팩토리 패턴)

Spring/디자인패턴

by Chan.94 2021. 12. 9. 10:19

본문

반응형

팩토리 패턴 사용 이유

객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮추어 코드를 건드리는 횟수를 최소화하기 위해

 

결합도는 왜 낮아지는 이유

객체지향 성질중에 하나인 다형성을 이용하였기 때문이다. 인터페이스를 구현한 객체들은 같은 인터페이스를 상속받았기 때문에 코드에 유연함이 있다.

 

코드를 건드리는 횟수가 최소화되는 이유

객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가/수정이 일어나더라도 객체를 생성하는 코드만 건들면 되기 때문이다.

 

팩토리 패턴 종류

* 팩토리 메서드 패턴

* 추상 팩토리 패턴


팩토리 메서드 패턴

객체를 생성하는 인터페이스는 미리 정의하되, 객체 생성은 서브 클래스(팩토리)로 위임하는 패턴

 

객체를 생성해서 반환하는 것을 말한다. 즉, 결과값이 객체인 것이다.


NotebookFactory의 입력값에 따라 LGNotebook객체를 생성할지 SamSungNotebook 객체를 생성할지 결정

public interface Notebook {

}
public class LGNotebook implements Notebook {

	public LGNotebook() {
		System.out.println("LG 노트북");
	}

}
public class SamSungNotebook implements Notebook{

	public SamSungNotebook() {
		System.out.println("SamSung 노트북");
	}

}
public class NotebookFactory {
	public Notebook createNotebook(String type) {
		Notebook notebook = null;
		
		switch (type) {
		case "LG":
			notebook = new LGNotebook();
			break;
		case "SamSung":
			notebook = new SamSungNotebook();
			break;

		}
		
		return notebook;
	}
}

MouseFactory의 입력값에 따라 LGMouse객체를 생성할지 SamSungMouse객체를 생성할지 결정

public interface Mouse {

}
public class LGMouse implements Mouse{

	public LGMouse() {
		System.out.println("LG 마우스");
	}

}
public class SamSungMouse implements Mouse{

	public SamSungMouse() {
		System.out.println("SamSung 마우스");
	}

}

ComputerFactory클래스에서 어떤 제조사의 노트북과 마우스를 선택할지 결정

public class ComputerFactory {
	public void createComputer(String type){
        NotebookFactory notebookFactory = new NotebookFactory();
        MouseFactory mouseFactory = new MouseFactory();

        notebookFactory.createNotebook(type);
        mouseFactory.createMouse(type);
        System.out.println("--- " + type + " 컴퓨터 완성 ---");
    }
}

 

테스트

public class FactoryMethodPatternMain {

	public static void main(String[] args) {
		ComputerFactory computerFactory = new ComputerFactory();
		computerFactory.createComputer("LG");
	}

}

/*
LG 노트북
LG 마우스
--- LG 컴퓨터 완성 ---
*/

컴퓨터에는 다양한 부품이 존재한다. 부품이 증가할수록 ComputerFactory에 해당 부품 Factory객체가 증가되어야 한다.

 

 


추상 팩토리 패턴

서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴


각각의 ComputerFactory에서 Notebook과 Mouse를 create 한다.

public interface NewComputerFactory {
	public Notebook createNotebook();
	public Mouse createMouse();
}
public class LGComputerFactory implements NewComputerFactory{

	@Override
	public LGNotebook createNotebook() {
		return new LGNotebook();
	}

	@Override
	public LGMouse createMouse() {
		return new LGMouse();
	}

}
public class SamSungComputerFactory implements NewComputerFactory{

	@Override
	public SamSungNotebook createNotebook() {
		return new SamSungNotebook();
	}

	@Override
	public SamSungMouse createMouse() {
		return new SamSungMouse();
	}

}
public class Factory {
	public void createComputer(String type){
        NewComputerFactory newcomputerFactory= null;
        switch (type){
            case "LG":
            	newcomputerFactory = new LGComputerFactory();
                break;

            case "SamSung":
            	newcomputerFactory = new SamSungComputerFactory();
                break;
        }

        newcomputerFactory.createNotebook();
        newcomputerFactory.createMouse();
    }
}

 

테스트

public class AbstractFactoryPatternMain {

	public static void main(String[] args) {
		Factory computerFactory = new Factory();
		computerFactory.createComputer("LG");
	}

}

/*
LG 노트북
LG 마우스
*/

 

팩토리 메서드 패턴은 각각 다른 객체들이 필요할 때 사용하며, 추상 팩토리 패턴은 서로 연관 있는 객체들의 조합이 필요할 때 사용한다.

반응형

'Spring > 디자인패턴' 카테고리의 다른 글

옵저버패턴(Observer Pattern)  (0) 2022.08.15
디자인 패턴 정리  (2) 2021.10.15
[싱글톤 패턴] Singleton Pattern  (5) 2021.10.13
프록시 패턴(Proxy Pattern)  (1) 2021.10.09

관련글 더보기

댓글 영역

>