프로그래밍
추상팩토리 패턴 [ 생성 ]
수박수박좋다
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());
팩토리메소드는 객체 생성을 팩토리클래스로 생성하게하는 생성패턴임
- 추상팩토리를 구현한 구상팩토리클래스에서 팩토리메소드(객체를 생성하는 코드)를 구현
- 추상팩토리에서 팩토리메소드를 수행하는 메소드를 구현함
- 팩토리메소드에서 필요한 객체를 생성함
- 객체 생성과정을 하위클래스로 위임하는 것이 목적임
- 하나의 팩토리당 하나의 프로덕트생성이 가능함
- 메소드레벨에서 객체생성을 컨트롤하여 클라이언트의 객체생성관련한 의존을 낮춤
반응형