class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
Car클래스와, Car클래스를 상속하여 SportsCar, Truck 클래스를 만든다.
SportsCar car = new SportsCar();
↓
Truck car = new Truck();
위의 코드는 특정 클래스에 직접 의존하고 있다.
따라서 car의 클래스를 SportsCar에서 Truck으로 변경할 때 코드 수정이 불가피하다.(직접 수정해줘야 함)
Car car = new SportsCar();
↓
Car car = new Truck();
이는 다형성을 활용한 객체 변경이다.
SportsCar와 Truck의 부모 클래스는 Car로 동일하다.
이렇게 선언을 하게 되면 같은 부모를 공유하고 있기 때문에 나중에 SportsCar -> Truck 클래스로 변경이 가능하게 된다.
이렇게 되면 프로그램 내에서 조건에 의해 car의 형태를 원하는대로 변경해줄 수 있다.
Factory Method
상위 클래스
객체를 생성하는 인터페이스를 정의
인스턴스를 만드는 방법만 결정하위 클래스
인스턴스를 생성
데이터의 생성을 책임지고 조작하는 함수들을 오버라이딩하여 인터페이스와 실제 객체를 생성하는 클래스를 분리
Car car = new getCar();
static Car getCar(){
return new SportsCar();
}
↓
static Car getCar(){
return new Truck();
}
특정 객체를 직접 생성하는 것이 아니라 메서드를 통해 객체를 반환하는 방식으로 객체를 생성한다.
필요에 따라 반환 객체를 쉽게 변경할 수 있다.
Car car = new SportsCar();
Car car = new Truck();
기존에는 객체를 생성할 때 직접 new 연산자를 사용하여 생성하였다.
이렇게 객체를 생성하면 크도를 직접 수정해야만 객체를 변경할 수 있기 때문에 유지 보수에 불리하다.
객체를 직접 코드에서 생성하는 것이 아니라, 설정 파일에서 어떤 클래스를 사용할지 결정한다.
이 경우 코드가 아니라 config.txt만 수정하면 객체 변경이 가능하다.
class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
class Engine{}
public class Main1 {
public static void main(String[] args) throws Exception {
Car car = (Car)getObject("car");
System.out.println("car: "+car);
Engine engine = (Engine)getObject("engine");
System.out.println("engine: "+engine);
}
static Object getObject(String key) throws Exception{
//config.txt를 읽어 Properties에 저장
Properties p = new Properties();
p.load(new FileReader("config.txt"));
//클래스 객체(설계도)를 얻어
Class clazz = Class.forName(p.getProperty(key));
//객체를 생성하여 반환
return clazz.newInstance();
}
}
car=com.springproject.ch1.SportsCar
engine=com.springproject.ch1.Engine
↓
car=com.springproject.ch1.Truck
engine=com.springproject.ch1.TurboEngine

main에서 getObject()에 매개변수로 car를 넣어서 보낸다.
-> 맵에서 key값이 car인 객체를 찾아 리턴하라는 의미
engine도 동일하게 동작
Properties는 <String, String> 형식으로 값을 저장하는 형태이다.
(맵과 비슷 <Object, Object>)
p.load()를 통하여 config.txt에 있는 내용을 불러온다.
그 후 clazz에 key의 값을 key로 가지고 있는 property를 저장하고, 새로운 인스턴스를 생성하여 반환한다.