본문 바로가기
카테고리 없음

델파이(Delphi) 디자인패턴(Design pattern) 5탄

by MonoSoft 2021. 6. 2.
728x90
반응형

FactoryMethod 패턴

 

팩토리 메서드는 = 팩토리 + 메서드 의 합성어 인데, 

여기서 말하는 팩토리(Factory) 란 말을 공장이란 의미로 이해하는 사람들이 많은데 , 

 

패턴강좌에서는 공장이란 말대신

 

어떤 클래스의 객체를 대신 생성해 주는 특수한 클래스

 


메서드는 말그대로 그 특수한 클래스의 메서드를 의미한다.

 

우리는 이 멤버 메서드를 호출하여 클래스의 객체를 가져올 것이다. 

자세한 내용은 이따가 보고,

이런 연유로 팩토리 메서드란 말이 나온 것이다.

 

팩토리 메서드는 이해하기 위해서는 다음의 코드를 보아야 한다.

 

다음의 코드에서 유심히 보아야 할 것은 abstract 가 붙어 있는 클래스의 생성자이다.

 

   TObj = class

   public

     Constructor Create; Virtual; Abstract;

   end;

 

이 클래스 TObj.Create 와 같은 방식으로 객체를 생성 할 수 없다. 

 

그 이유는 생성자에 Abstract 추상화 지시어가 붙어 있기 때문이다. 

패턴강좌를 볼 정도면 추상화에 대해

어느정도 아시겠지만, 

이 지시어가 붙게 되면 메서드 정의만 할뿐 구현은 하위클래스에서

하여야 한다는 원칙이 적용된다.

 

다시말해 이 클래스를 써 먹으려면 다른 클래스가 필요하다는 얘기가 된다.

 

그래서 이 클래스를 써 먹을 수 있는 다른 클래스 하나를 만들자.

 

   TFactoryObj = class(TObj)

   private

     constructor Create;override;

   public

     class function GetObj : TObj;//얘가 바로 Factory Method 다. 객체를 생성해서 리턴한다.

   end;

 

위 클래스의 역활은 TObj 객체를 생성시켜 GetObj 의 반환값으로 돌려 

주는 역활 밖에는 하지 않는다.

Abstract 인 TObj.Create 를 직접구현하기 위해 override 를 사용했다. 

이것을 전문용어로 ConCreate 라 한다.

 

GetObj 앞에 class (Static Method) 를 붙인 이유는 

클래스 객체 생성을 위해 또하나의 클래스 객체를

생성한다는 것이 상당히 무의미한 일이기 때문이다. 

class 를 붙이게 되면 객체생성 과정을 생략 할 수 있다.

 

지금까지의 내용이 팩토리 메서드의 핵심형태이다. 

이 이상도 이하도 없다. 이렇게만 보면 정말 간단한것

같은데 이걸 이 개념을 잘못 파악하는 있는 사람들이 태반인 것이 실화다.

 

다시정리하자면, 어떤 클래스(TObj) 가 있는데, 

이 클래스의 생성자가 Abstract 라는 이유 때문에

TObj.Create 와 같은 방식으로 객체를 직접 생성 할 수 없다. 

해서 객체를 대신 생성해주는 클래스를

만든후 그 클래스의 메서드에 객체를 생성해 달라고 요청해야 하는데, 

그 요청을 처리해 주는 녀석이 바로 Factory Method 란 얘기다.

 

Factory Method 에 대한 구조파악은 이쯤에서 잘 되었으리라 본다.

 

그런데 이딴 짓을 왜 하는 것일까? 

클래스를 직접 생성해서 쓰면 되지 왜 팩토리 메서드란 개념을 두어

 

객체를 생성해야 하는 것일까? 

 

다음과 같은 이유를 들수 있겠다.

 

1. 객체의 캡슐화

   객체의 캡슐화란 말은 쉽게 말해 객체를 은닉시키는 것이다. 

   클래스를 객체화 해서 사용하는

   사용자에게 객체가 어떤식으로 생성되는지 

   굳이 알리고 싶지 않을 때가 있다. 

   아니 알필요가 없으니 신경쓰지 말라고 하고플 때가 있다. 

   이런 경우  최종적으로 생성된 객채만을 넘겨주는 형식을

   취하므로써 은닉성을 가질 수 있다.

 

2. 싱글톤의 개념처럼 객체의 생성을 사용자의 편의에 맞겨서는 안되는 경우가 있다.

   예를 들어 프로그램내에서는 TObj 의 객체가 

   딱 5개까지만 생성이 허용되어야 한다고 가정하면

   TObj.Create 를 막 사용하게 되면 객체의 생성이 무분별하게 되어 

   어떤 문제가 초래될 수도 있기 때문이다. 

   이런경우 팩토리 메서드가 객체의 생성을 통제하는 역활을 할 수 있다.

 

3. TObj 의 생성자의 매개변수의 형태나 갯수가 바뀌면 TObj 를 가져다 쓰는 

   하위 클래스의 모조리 바꿔야

   하는 불편함이 있다. 

 

이런경우 팩토리를 사용하면 어느정도 수고를 들 수 있다.

FactoryMethod.zip
0.21MB

728x90
반응형

댓글