Daily coding

Java Basic : day 13 - Factory Pattern 팩토리패턴 본문

Language/Java_basic

Java Basic : day 13 - Factory Pattern 팩토리패턴

sunnnkim 2019. 12. 4. 20:35

Factory Pattern


  - Singleton Pattern
  : 중심이 되는 데이터 관리 template(list, map)을 중심으로 
      어디서나 접근이 용이하게 하기 위한 패턴 
  instance는 한 개

- Factory pattern
: 원하는 클래스의 형태를 생성하기 용이한 패턴.
  게임 프로그래밍에 많이 사용
    
팩토리 메소드 패턴 : 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를

                           만들지는 서브클래스에서 결정하게 만든다. 즉 팩토리 메소드 패턴을 이용하면

                           클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것.

 

추상 팩토리 패턴 : 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성.

( 출처: https://jusungpark.tistory.com/14 [정리정리정리] )

 

  < 예시 >
  interface, class 동물
  class 고양이, 멍멍이, 황소
  Animal a = new Cat();
 

// 구현하려는 메소드를 선언한 인터페이스

public interface Animal {
             public void printDescript();
}

 

// 팩토리에서 생산할 클래스1

public class Cat implements Animal {
       @Override
       public void printDescript() {
              System.out.println("야옹이 입니다.");
       
       public void catMethod() {
              System.out.println("야옹 야옹");
       }
}

 

// 팩토리에서 생산할 클래스2

public class Cow implements Animal{
       @Override
       public void printDescript() {
              System.out.println("황소 입니다");
       }
       public void cowMethod() {
              System.out.println("음머우");
       }
}

 

// 팩토리에서 생산할 클래스3

public class Dog implements Animal{
       @Override
       public void printDescript() {
              System.out.println("멍멍이 입니다.");
       }

       public void dogMethod() {
              System.out.println("멍멍멍");
       }
}

 

 

// 공장클래스 (실제 패턴이 만들어지는 곳) 
public class AnimalFactory {
    public static Animal crate(String animalName) {

            if(animalName.equals("")) {
                  System.out.println("생성할 클래스가 없습니다.");
            }
            if(animalName.equals("야옹이")) {
                  return new Cat();
            }else if(animalName.equals("멍멍이")) {
                  return new Dog();
            }else if( animalName.equals("황소")) {
                  return new Cow();
            }
            return null;
      }
}

 


// main 클래스

 

 

 

 

* 공장에서 클래스 찍어내기

Animal ani1 = AnimalFactory.crate("멍멍이");
ani1.printDescript();

ani1 = AnimalFactory.crate("야옹이");
ani1.printDescript();

ani1 = AnimalFactory.crate("황소");
ani1.printDescript();

 

 


// 리스트로 만들어서 관리 가능
List list = new ArrayList();
ani1 = AnimalFactory.crate("멍멍이");
list.add(ani1);

ani1 = AnimalFactory.crate("야옹이");
list.add(ani1);

ani1 = AnimalFactory.crate("황소");
list.add(ani1);
for (int i = 0; i < list.size(); i++) {
Animal a = list.get(i);
a.printDescript();

 

 

// 인스턴스의 타입에 따라 다른 메소드 결과 출력하기

 

if(a instanceof Cat) {
         ((Cat)a).catMethod();
}
else if(a instanceof Dog) {
         ((Dog)a).dogMethod();
}
else if(a instanceof Cow) {
         ((Cow)a).cowMethod();
}
}


}
}