내일배움캠프를 통한 C++ 학습 과정 중 인터페이스를 사용한 다형성 및 캡슐화를 다루는 미니과제가 있었습니다.

 

UML 클래스 다이어그램 과정은 이렇습니다.

 

해당 다이어그램에서 인터페이스 Animal을 상속받는 Dog,Cat,Cow 클래스와,

Animal 객체들을 생성, 메서드 호출을 담당하는 Zoo클래스가 있습니다.

 

해당 다이어그램을 보았을 때 Zoo::addAnimal 메서드의 매개변수들을 전달하기 위해서는 Main 클래스에서 

Animal의 구현클래스들을 선언하는 구조가 되어있었습니다.

다형성 및 캡슐화를 중점으로 다루는 해당 과제에서 어떤 디자인 패턴이 어울리는지 찾아보던 도중, 팩토리 메서드 패턴을 적용하여 매개변수를 전달하는것이 가장 어울리는 것 같아 팩토리 메서드 패턴에 대한 포스팅을 하게 되었습니다.

 

이번 포스팅에서는 팩토리 메서드 패턴의 정의 및 특징, 그리고 장단점에 대해 알아보겠습니다.

 

Factory Method Pattern(팩토리 메서드 패턴)

  • 객체 생성을 공장(Factory) 클래스로 캡슐화 처리하여 대신 생성하게 하는 생성 디자인 패턴
  • 새로운 제품(클래스)를 추가 시에도 서브클래스만 추가하면 된다. -> 유지보수성 및 유연성이 높다.
  • 구체적인 클래스에 의존하지 않아 결합도를 낮추고 확장성을 높일 수 있다.

 

장점 및 단점

  • 기존의 코드에 영향을 미치지 않으면서, 새로운 서브 클래스만 추가하면 된다.
  • 객체 생성에 대한 세부사항을 캡슐화 하여 유지보수성을 향상시킨다.
  • 객체 생성 방식이 변경되어도 클라이언트는 영향을 받지 않는다.
  • 객체 생성이 여러 단계의 추상화로 이루어지기때문에, 불필요한 복잡성이 높아질 수 있다.

 

사용 예시

해당 사용 예시는 미니 과제를 중점으로 제작하였으며, Simple Factory Pattern으로 구현되었습니다.

해당 사유는 미니 과제를 중점이며 동시에 캡슐화를 사용한 정보은닉을 목적으로 하며 동시에 직관적으로 표현하기 위해서입니다.

팩토리 메서드 패턴으로 변형을 하려면 createAnimal 메서드를 추상화 하여 하위 클래스에서 구현 및 각 Animal 클래스들의 생성부분을 구현해야합니다.

 

Factory

Factory에서는 클라이언트에서 AnimalType을 매개변수로 받아 그에 맞는 객체 생성을 담당합니다.

class AnimalFactory
{
public:
	static Animal* createAnimal(const AnimalType& type);
};
Animal* AnimalFactory::createAnimal(const AnimalType& type)
{
	switch (type)
	{
	case DOG:
		return new Dog;
		break;
	case CAT:
		return new Cat;
		break;
	case COW:
		return new Cow;
		break;
	default:
		throw std::invalid_argument("AnimalType Eroor");
		break;
	}
}

 

Client

	// 재사용성 고려 보다는 협업 시 명확한 의도를 전달하기 위해 열거형을 사용했습니다.
	switch (randNum)
	{
	case DOG:
		return AnimalFactory::createAnimal(AnimalType::DOG);
		break;
	case CAT:
		return AnimalFactory::createAnimal(AnimalType::CAT);
		break;
	case COW:
		return AnimalFactory::createAnimal(AnimalType::COW);
		break;
	default:
		break;
	}

 

팩토리클래스의 createAnimal는 전역 함수이기때문에 해당 팩토리의 객체를 생성하지않고 호출할 수 있게 구현하였습니다.

 

 

정리

  • 객체 생성을 Factory 클래스로 캡슐화 처리하여 해당 객체를 대신 생성하는 디자인 패턴.
  • 객체 생성에 대한 세부사항을 캡슐화하여 유지보수성 향상 및 정보은닉성을 향상시킨다.
  • 기존의 코드에 영향을 미치지 않으며, 수정시 새로운 서브클래스만 추가하면 된다.
  • 하나의 Factory에서 생성을 담당한다 - Simple Factory Pattern
  • 상위 Factory 클래스를 인터페이스화, 하위 클래스에서 구현한다 - Factory Method Pattern

+ Recent posts