728x90
반응형
Abstract Factory Pattern
- 추상팩토리 패턴은 연관된 객체들의 집합을 형성할때 이용하는 디자인 패턴이다.
- 하나의 클래스를 만들고 객체를 만드는 방식에 따라 기능을 독립적으로 구현하기 위해 사용하는 패턴이다.
- 구조보다 코드를 보면서 이해하는게 빠르다.
Abstract Factory Pattern 구조
추상팩토리의 구조이다.
- 1. 아이템 A, B, C 의Interface 있다.
- 실제 구현체는 Factory 를 통해 구현이 된다. - 2. Factory 역시 Interface 가 있다.
- 상황에 맞는 Factory 를 만들어 다른 객체를 만들어 낸다.
Abstract Factory Pattern 예제
- 기본적으로 CarFactory 있다.
- CarFactory 를 이용해 다른 자동차 공장을 만든다.
- BMW, Benz 등 - 필요한 부품은 Frame, Wheel, Engine 이 있다.
- Frame, Wheel, Engine 을 상속받아 각 공장에 맞는 필요한 부품들을 구현한다.
Abstract Factory Pattern 구현
Interface 부분
CarFactory
public interface CarFactory {
public Frame createFrame();
public Wheel createWheel();
public Engine createEngine();
}
Frame
public interface Frame {
void info();
}
Wheel
public interface Wheel {
void info();
}
Engine
public interface Engine {
void info();
}
BMW 구현 부분
BMWFactory
public class BMWFactory implements CarFactory {
@Override
public Frame createFrame() {
return new BMWFrame();
}
@Override
public Wheel createWheel() {
return new BMWWheel();
}
@Override
public Engine createEngine() {
return new BMWEngine();
}
}
BMWFrame
public class BMWFrame implements Frame {
@Override
public void info() {
System.out.println("BMW 바디");
}
}
BMWWheel
public class BMWWheel implements Wheel {
@Override
public void info() {
System.out.println("BMW 바퀴");
}
}
BMWEngine
public class BMWEngine implements Engine {
@Override
public void info() {
System.out.println("BMW 엔진");
}
}
Main
public class Main {
public static void main(String[] args) {
// 간단한 변경으로 다른 종류의 car 를 만들수 있다.
CarFactory benzCarFactory = new BenzFactory();
CarFactory BMWCarFactory = new BMWFactory();
Frame body = benzCarFactory.createFrame();
Wheel wheel = benzCarFactory.createWheel();
Engine engine = BMWCarFactory.createEngine();
body.info();
wheel.info();
engine.info();
}
}
결과
각각 개별적으로 아이템을 만들었다.
Benz 바디
Benz 바퀴
BMW 엔진
참고
Benz 는 내용만 다르기 때문에 생략한다.
코드 문제점
- 결과를 보면 Benz 와 BMW 가 섞여 있다.
- 그렇게 되면 정상동작이 불가능 할것 이다.
- 그래서 여기다가 팩토리 메서드 패턴을 적용해본다.
Factory Method Pattern 적용하기
CarFactoryMethod
- CarFactoryMethod 클래스 를 만들었다.
- getInstance 에서 각각 맞는 객체를 생성후 리턴해준다.
public class CarFactoryMethod {
static public CarFactory getInstance(int type) {
switch (type) {
case 1:
return new BenzFactory();
case 2:
return new BMWFactory();
default:
System.out.println("존재 하지 않는 타입입니다. BenzFactory 를 반환합니다.");
return new BenzFactory();
}
}
}
Main
이제 getInstance 에 원하는 타입만 넣어주면된다.
public class Main {
public static void main(String[] args) {
// 간단한 변경으로 다른 종류의 car 를 만들수 있다.
/*
CarFactory benzCarFactory = new BenzFactory();
CarFactory BMWCarFactory = new BMWFactory();
*/
CarFactory carFactory = CarFactoryMethod.getInstance(1);
Frame body = carFactory.createFrame();
Wheel wheel = carFactory.createWheel();
Engine engine = carFactory.createEngine();
body.info();
wheel.info();
engine.info();
}
}
전체코드
https://github.com/rnrl1215/design-pattern/tree/main/src/main/java/patterns/abstractfacotry
728x90
반응형
'Design pattern > GoF(인강편)' 카테고리의 다른 글
[Design Pattern] Composite Pattern (0) | 2022.08.15 |
---|---|
[Design Pattern] Bridge Pattern (0) | 2021.12.26 |
[Design Pattern] Builder Pattern (0) | 2021.11.24 |
[Design Pattern] Prototype Pattern (0) | 2021.11.24 |
[Design Pattern] Singleton Pattern (0) | 2021.11.24 |
댓글