Java/DesignPattern

[Java-DesignPattern] Factory Pattern이란? 팩토리패턴 설명

Jeong Jeon
반응형

팩토리패턴이란?

상위 클래스(부모)와 하위 클래스(자식)가 있을 때, 별도의 팩토리 클래스를 사용하여 하위 클래스의 인스턴스를 생성하는 패턴.

 

팩토리패턴이 이거구나 하기 전까지는 무의식 중으로 사용했을 수 있다고 본다.

 

코드를 보고 확인하자.

 

Animal.java -> 부모클래스

public class Animal {
    public Animal(){
    }
    //Animal의 메소드
}

 

자식 1 Dog

public class FactoryDog extends Animal{
    public FactoryDog(){
        // 생성자
    }
    public FactoryDog(String data){
        return;
    }
    //Dog의 메소드 ...
    public String toString(){
        return "Dog";
    }

 

자식 2 Cat

public class FactoryCat extends Animal{
    public FactoryCat(){
        // 생성자
    }
     public FactoryCat(String string) {
         return;
    }
    //Cat의 메소드 ...
    public String toString(){
        return "Cat";
    }
}

 

Factory.java

public class AnimalFactory {

	static FactoryAnimal create(String string) {
		if(string.equals("Dog")) {
			return new FactoryDog(string);
		}else if(string.equals("Cat")) {
			return new FactoryCat(string);
		}//..등등

		return null;
	}

}

 

Factory패턴을 적용하기 전과 적용후의 코드를 확인해 보자.

만약 위 Factory를 사용하지 않고 일반적인 방식으로 사용한다면 아래와 같이 사용하게 될것이다.

하지만 Dog , Cat말고도 다른 동물들이 추가되었을때 사용만하는 관계없는 FactoryMain.class의 코드를 수정해주어야한다.

 

우리는 관련있는 클래스만 만들고 수정하고 삭제하고, 그것을 가져다 쓰는 방식을 채택하기 위해 팩토리 패턴을 적용했다고 생각하면 쉬울것 같다.

추가적으로 사용하는곳에서는 내부 Dog Cat 등등이 어떻게 이루어져있는지 알 수없다. 그저 제공해주는 정보만 사용할 수 있을뿐.

 

팩토리패턴 적용X 코드

public class FactoryMain {

	public static void main(String[] args) {
		//초기 샘플 데이터 입력해둠.
		ArrayList<String> list = new ArrayList<String>();
		list.add("Dog");
		list.add("Cat");

		//팩토리 미적용시
		Iterator<String> iter1 = list.iterator();
		while(iter1.hasNext()) {
        	String cate = iter1.next();
			if(cate.equals("Dog")) {
				FactoryDog dog = new FactoryDog();
				System.out.println(dog);
			}else if(cate.equals("Cat")) {
				FactoryCat cat = new FactoryCat();
				System.out.println(cat);
			}//등등
		}
	}
}

 

팩토리 패턴 적용코드

public class FactoryMain {

	public static void main(String[] args) {
		//초기 샘플 데이터 입력해둠.
		ArrayList<String> list = new ArrayList<String>();
		list.add("Dog");
		list.add("Cat");

		//팩토리 패턴 적용시
		Iterator<String> iter2 = list.iterator();
		while(iter2.hasNext()) {
			FactoryAnimal animal = AnimalFactory.create(iter2.next());
			System.out.println(animal);
		}
	}
}

사용하는곳에서는 간단하게 Factory.create메서드로 동일하게 적용하여 사용할 수 있다.

 

어떻게 사용하는지, 왜 사용하는지를 알고 적재적소에 사용해야 좋다.

 

반응형