Error rendering WebPanel: No renderer found for resource type: velocity Template contents: <meta name="ajs-keyboardshortcut-hash" content="$keyboardShortcutManager.shortcutsHash">
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동



개념

구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나 서로 독립적인 객체들의 집합을 생성 할 수 있는 인터페이스를 제공하는 패턴


다른 이름

 키트

 

추상 팩 토리는 언제 사용할까?



  1.  객체가 생성되거나, 구성. 표현되는 방식과 무관하게 시스템을 독립적으로 만들자고 할 때

  2.  여러 제품 군 중 하나를 선택해서 시스템을 설정해야 하고, 한번 구성한 제품을 다른 것으로 대체 할 수 있을 때

  3.  관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때

  4.  제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출 시키시고 싶을 때




구성 요소


  • Abstract Factory: 개념적 제품에 대한 객체를 생성하는 연산으로 인터페이스를 정의.


  • Concrete Factory: 구체적으로 팩 토리가 생성할 객체를 정의하고, Abstract Product가 정의하는 인터페이스 구현.


  • Abstract Product: 개념적 제 품 객체에 대한 인터페이스를 정의합니다

  • Concrete Product : 구체적으로 팩토리가 생성할 객체를 정의하고, Abstract Product가 정의하는 인터페이스를 구현합니다.

  • Client: Abstract Factory, Abstract Product클래스에 선언된 인터페이스 사용


추상 팩 토리의 장 단점


  1. 구체적인 클래스를 분리한다..

  2. 제품 군을 쉽게 대체 할 수 있다.

  3. 제품 사이의 일관성을 증진 시킨다.

  4. 새로운 종류의 제품을 제공하기 어렵다.



Abstract factory vs factory method pattern


Example



public interface AbstractFactory {


AbstractProductA createProductA();

AbstractProductB createProductB();


}




public interface AbstractProductA {

        void print();

}




public interface AbstractProductB {

 void print();

}




public class ProductA1 implements AbstractProductA {

@Override
public void print() {
System.out.println("productA1");

}

}




public class ProductA2 implements AbstractProductA {


@Override
public void print() {
System.out.println("productA2");

}


}




public class ProductB1 implements AbstractProductB {


@Override
public void print() {
System.out.println("productB1");

}


}




public class ProductB2 implements AbstractProductB {


@Override
public void print() {
System.out.println("productB2");

}


}




public class ConcreteFactory1 implements AbstractFactory{

@Override
public AbstractProductA createProductA() {

return new ProductA1();

}

@Override
public AbstractProductB createProductB() {

return new ProductB1();

    }

}




public class ConcreteFactory2 implements AbstractFactory{

@Override
public AbstractProductA createProductA() {

return new ProductA2();

    }

@Override
public AbstractProductB createProductB() {

return new ProductB2();

    }

}



public class Client {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory1();

factory.createProductA().print();

factory.createProductB().print();


System.out.println();

factory = new ConcreteFactory2();


factory.createProductA().print();

factory.createProductB().print();

     }
}





  • interface가 아닌 abstract 클래스 사용 가능하다.



출처 : Gof의 디자인 패턴


  • 레이블 없음