- 정의
- 사용 이유
- 구현
new
로 객체를 생성하는 것을 서브 클래스에 위임. = 객체를 만들어내는 공장(Factory 객체)을 만드는 패턴자동차를 생산하는 과정
public interface Car {
void getName();
}
public class KingCar implements Car {
@Override
public void getName() {
System.out.println("King Car.");
}
}
public class QueenCar implements Car {
@Override
public void getName() {
System.out.println("Queen Car.");
}
}
public class FactoryA {
public Car makeCar(String carName){
Car car = null;
switch (carName) {
case "king":
car = new KingCar();
break;
case "queen":
car = new QueenCar();
break;
}
return car;
}
}
public class FactoryB {
public Car makeCar(String carName){
Car car = null;
switch (carName) {
case "king":
car = new KingCar();
break;
case "queen":
car = new QueenCar();
break;
}
return car;
}
}
public class NonClient {
public static void main(String[] args) {
FactoryA a = new FactoryA();
FactoryB b = new FactoryB();
a.makeCar("king").getName();
a.makeCar("queen").getName();
b.makeCar("king").getName();
b.makeCar("queen").getName();
}
}
print >>>
King Car.
Queen Car.
King Car.
Queen Car.
팩토리가 많아질수록 switch
구문이 중복되어 사용될 수 있다. 즉, 객체 생성은 객체 간의 결합도를 증가시키며, 동시에 유지보수가 어려워진다.
팩토리 메서드 패턴을 사용하여 결합도를 낮추고 유지보수에 용이하도록 변경 (Car
, KingCar
, QueenCar
는 변경 X)
public class CarFactory {
public Car makeCar(String name) {
/*try {
Class<?> cls = Class.forName(className);
return (Car) cls.newInstance();
} catch (Exception e) {
return null;
}*/
Car car = null;
switch (name) {
case "king":
car = new KingCar();
break;
case "queen":
car = new QueenCar();
break;
}
return car;
}
}
public class A {
public Car makeCar(String name) {
CarFactory carFactory = new CarFactory();
Car car = carFactory.makeCar(name);
return car;
}
}
public class B {
public Car makeCar(String name) {
CarFactory carFactory = new CarFactory();
Car car = carFactory.makeCar(name);
return car;
}
}
public class AdaptClient {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.makeCar("king").getName();
a.makeCar("queen").getName();
b.makeCar("king").getName();
b.makeCar("queen").getName();
}
}
print >>>
King Car.
Queen Car.
King Car.
Queen Car.
/*...*/
은 클래스 이름
을 통해 반환A
, B
, ... 등 CarFactory
를 통해 차를 생산하면 중복되는 코드(switch
)가 없고, 결합도를 낮춰 유지보수가 더욱 용이해진다.