생성자 패턴: 추상 팩토리 패턴

xellos·2022년 3월 29일
0

디자인 패턴

목록 보기
3/20

소개

  • 서로 과련이 있는 여러 객체를 만들어주는 인터페이스
  • 구체적으로 어떤 클래스의 인스턴스를 사용하는지 감출 수 있다.

1) 특징

  1. 팩토리 메서드와 흡사하게 객체 생성 과정을 추상화한 인터페이스를 제공한다.
  2. 팩토리 메서드는 팩토리의 구현에 초점을 둔다면 추상 팩토리는 팩토리를 사용하는 방법에 초점이 있다.
  3. 팩토리 메서드는 구체적인 객체 생성 자체를 하위 또는 구체 클래스로 이동시키는 것이 목적이다.
  4. 추상 팩토리 메서드는 여러 부품과도 같은 부분들에 대하여 구체적인 클래스가 아닌 추상화에 의존하는 것에 더 목적이 있다. 따라서 클래스나 인스턴스의 추가와 그에 따른 교체를 쉽게 하는것이 목적이다.

구현

  • 여기에서는 자동차를 생산하는 공장의 예제를 생각한다.
  • 아반떼와 소나타의 부품이 될 겉모양 Frame과 바퀴의 Wheel을 추상화해서 각각 아반떼와 소나타의 부품을 생성했다.

1) Frame 생성

인터페이스

public interface Frame {
	void shape();
}

구현 클래스

public class AdvanteFrame implements Frame {

	@Override
    public void Shape() {
    	System.out.println("아반떼 프레임 생성");
    }
}

public class SonataFrame implements Frame {

	@Override
    public void Shape() {
    	System.out.println("소나타 프레임 생성");
    }
}

2) Wheel 생성

인터페이스

public interface Wheel {
	void size();
}

구현 클래스

public class AvanteWheel implements Wheel {

	@Override
    public void size() {
    	System.out.println("아반떼 휠 사이즈: 17");
    }
}

public class SonataWheel implements Wheel {

	@Override
    public void size() {
    	System.out.println("소나타 휠 사이즈: 19");
   	}
}

3) 팩토리

인터페이스

public interface CarFactory {
	Frame createFrame();
    Wheel createWheel();
}

구현 클래스

public class AvanteFactory implements CarFactory {
	@Override
    public Frame createFrame() {
    	return new AvanteFrame();
    }
    
    @Override
    public Wheel createWheel() {
    	return new AvanteWheel();
    }
}

public class SonataFactory implements CarFactory {
	@Override
    public Frame createFrame() {
    	return new SonataFrame();
    }
    
    @Override
    public Wheel createWheel() {
    	return new SonataWheel();
    }
}

4) 사용하기

Car 클래스

@Getter
public class Car {
	private Frame frame;
    private Wheel wheel;
    
    public Car(Frame frame, Wheel wheel) {
    	this.frame = frame;
        this.wheel = wheel;
    }
}

Main 함수

public static void main(String[] args) {
	CarFactory avanteFactory = new AvanteFactory();
    Car avante = new Car(avanteFactory.createFrame(), avanteFactory.createWheel());
    avante.getFrame().shape();
    avante.getWheel().size();
    
    CarFactory sonataFactory = new SonataFactory();
    Car sonata = new Car(sonataFactory.createFrame(), sonataFactory.createWheel());
    sonata.getFrame().shape();
    sonata.getWheel().size();
}

0개의 댓글