프로그래밍

추상팩토리 패턴 [ 생성 ]

수박수박좋다 2024. 7. 28. 11:30
반응형

추상팩토리 [생성]

구상 클래스( Concrete class ) : 추상과 대조적임. 구체적이고 명확함. New 키워드로 객체를 생성할 수 있는 클래스, 클래스의 모든 메소드를 구현한 클래스

관련 객체들의 구상클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있음

객체 생성을 캡슐화함

하나의 팩토리에서 여러 종류의 객체생성을 지원

 

예제코드

interface AbstractProductA {
  usefulFunctionA(): string;
}
interface AbstractProductB {
  usefulFunctionB(): string;
  anotherUsefulFunctionB(collaborator: AbstractProductA): string;
}

interface AbstractFactory {
  // 팩토리의 목적은 객체생성을 위한 인터페이스를 제공하는 것
  createProductA(): AbstractProductA;
  createProductB(): AbstractProductB;
}

// 객체생성을 클래스단위로 캡슐화한다.
// 새로운 객체생성 방법을 추가하려면 새로운 팩토리 클래스를 추가하면 된다.
class ConcreteFactory1 implements AbstractFactory {
  // 추상팩토리클래스의 구상클래스
  public createProductA(): AbstractProductA {
    return new ConcreteProductA1();
  }
  public createProductB(): AbstractProductB {
    return new ConcreteProductB1();
  }
}

class ConcreteFactory2 implements AbstractFactory {
  public createProductA(): AbstractProductA {
    return new ConcreteProductA2();
  }
  public createProductB(): AbstractProductB {
    return new ConcreteProductB2();
  }
}

class ConcreteProductA1 implements AbstractProductA {
  public usefulFunctionA(): string {
    return "{Result of the ConcreteProductA1}";
  }
}
class ConcreteProductA2 implements AbstractProductA {
  public usefulFunctionA(): string {
    return "{Result of the ConcreteProductA2}";
  }
}

class ConcreteProductB1 implements AbstractProductB {
  public usefulFunctionB(): string {
    return "{Result of the ConcreteProductB1}";
  }
  public anotherUsefulFunctionB(collaborator: AbstractProductA): string {
    const result = collaborator.usefulFunctionA();
    return `{Result of the ConcreteProductB1 collaborating with (${result})}`;
  }
}

class ConcreteProductB2 implements AbstractProductB {
  public usefulFunctionB(): string {
    return "{Result of the ConcreteProductB2}";
  }
  public anotherUsefulFunctionB(collaborator: AbstractProductA): string {
    const result = collaborator.usefulFunctionA();
    return `{Result of the ConcreteProductB2 collaborating with (${result})}`;
  }
}


function clientCode(factory: AbstractFactory) {
  const productA = factory.createProductA();
  const productB = factory.createProductB();

  console.log(productB.usefulFunctionB());
  console.log(productB.anotherUsefulFunctionB(productA));
}

clientCode(new ConcreteFactory1());
  • 객체 생성을 담당하는 팩토리클래스가 존재함
  • 새로운 객체들을 생성하기 위해선 클래스단위의 팩토리를 추가하면 된다.
  • 팩토리메소드는 객체생성을 담당하는 메소드단위로 분리되기 때문에 팩토리당 하나의 객체지만 추상팩토리는 클래스단위로 관리되기에 관련된 여러 객체를 생성할 수 있다.

 

 

팩토리메소드패턴을 클래스단위로 나눈 패턴

//팩토리메소드 예제 코드
interface Product {
  operation(): string;
}

abstract class Creator {
  // 객체생성을 위한 팩토리 메소드
  // 서브클래스에서 구현하여 객체를 생성, 객체 생성에 대한 책임을 서브클래스로 위임
  public abstract factoryMethod(): Product;

  public someOperation(): string {
    // 객체 생성, 다른 작업을 수행
    const product = this.factoryMethod();
    return `Creator: The same creator's code has just worked with ${product.operation()}`;
  }
}

class ConcreteCreator1 extends Creator {
  // 팩토리 메소드를 구현하여 객체 생성
  public factoryMethod(): Product {
    return new ConcreteProduct1();
  }
}

class ConcreteCreator2 extends Creator {
  public factoryMethod(): Product {
    return new ConcreteProduct2();
  }
}

class ConcreteProduct1 implements Product {
  // 구체적인 제품
  public operation(): string {
    return "{Result of the ConcreteProduct1}";
  }
}

class ConcreteProduct2 implements Product {
  public operation(): string {
    return "{Result of the ConcreteProduct2}";
  }
}

function clientCode(creator: Creator) {
  console.log(
    "Client: I'm not aware of the creator's class, but it still works."
  );
  console.log(creator.someOperation());
}

console.log("App: Launched with the ConcreteCreator1.");
clientCode(new ConcreteCreator1());
console.log("");

console.log("App: Launched with the ConcreteCreator2.");
clientCode(new ConcreteCreator2());

팩토리메소드는 객체 생성을 팩토리클래스로 생성하게하는 생성패턴임

  • 추상팩토리를 구현한 구상팩토리클래스에서 팩토리메소드(객체를 생성하는 코드)를 구현
  • 추상팩토리에서 팩토리메소드를 수행하는 메소드를 구현함
  • 팩토리메소드에서 필요한 객체를 생성함
  • 객체 생성과정을 하위클래스로 위임하는 것이 목적임
  • 하나의 팩토리당 하나의 프로덕트생성이 가능함
  • 메소드레벨에서 객체생성을 컨트롤하여 클라이언트의 객체생성관련한 의존을 낮춤
반응형