Java 38. Factory Method Pattern (Design Pattern - 6)
Factory Method Pattern
1. Factory Method Pattern 이란?
- 인스턴스 작성을 하위 클래스에게 위임
- Template Method 패턴을 인스턴스 생성에 적용
2. 의도와 동기
- 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 결정하게 함.
- 여러 상황에 따라 각각 생성될 수 있는 객체에 대한 생성을 하위 클래스에 위임
- 생성과 관련된 동일한 메서드는 상위 클래스에서 처리
3. 객체 협력
-
4. 중요한 결론
- 상황에 따라 다양한 인스턴스 생성을 할 수 있음
5. 예제
- Car.java
package factorymethod;
public abstract class Car {
String carType;
public String toString(){
return carType;
}
}
- Sonata.java
package factorymethod;
public class Sonata {
public Sonata(){
cartype = "Sonata"
}
}
- Santafe.java
package factorymethod;
public class Santafe {
public Santafe(){
cartype = "Santafe"
}
}
- CarFactory.java
package factroymethod;
public abstract class CarFactory {
public abstract Car createCar(String name);
public abstract Car returnCar(String name);
public void numbering(){
System.out.println("numbering");
}
public void washCar(){
System.out.println("washCar");
}
final public void sellCar(String name){
numbering();
createCar(name);
washCar();
}
}
- HyundaiCarFactory.java
package factorymethod;
public class HyundaiCarFactory extends CarFactory {
HashMap<String, Car> carMap = new HashMap<String, Car>();
@Override
public Car createCar(String name){
Car car = null;
if( name == "sonata"){
car = new Sonata();
}
else if( name == "santafe"){
car = new Santafe();
}
return car;
}
@Override
public Car returnCar(String name){
Car car = carMap.get(name);
if(car == null){
if(name.equals("Tomas")){
car = new Sonata();
}
else if(name.equals("James")){
car = new Santafe();
}
carMap.put(name, car);
}
return car;
}
}
- CarTest.java
package factorymethod;
public class CarTest {
public static void main(String[] args){
CarFactory factory = new HyundaiCarFactory();
Car newCar = factory.crateCar("sonata");
System.out.println(newCar); // sonata
Car myCar = factory.returnCar("Tomas"); // Sonata
Car hisCar = factory.returnCar("Tomas"); // Sonata
}
}
댓글남기기