티스토리 뷰

Cocos2d-x를 하다 보면 팩토리 패턴 함수들이 자주 눈에 띕니다.
가장 많이 쓰는 CCSprite를 예로 들어보면
### cpp
static CCSprite* spriteWithTexture(CCTexture2D *pTexture);
static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect);
static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset);
static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName);
static CCSprite* spriteWithFile(const char *pszFileName);
static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);
static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);
 
이 정도 쯤 되겠네요.
다른 예로는
### cpp
CCScene *pScene = GameScene::scene(); 

이렇게 씬을 만들 때 ::scene()으로 만드는 것도 팩토리 패턴의 일종입니다.


패턴이라고 어렵게 생각하실 필요는 없습니다.
단어 뜻 그대로 받아들이면 되는데요.
Factory, 공장입니다. 즉 객체를 생산하는 공장이라고 생각하시면 됩니다.
보통은 "객체 * 변수명 = new 객체;" 방식으로 객체를 생성하고 메모리 할당을 하는데
이것을 좀 더 형식적으로 쓸 수 있게 해줍니다. 또한 함수 속에서 객체 생성을 할 때 필요한 작업들을 통합적으로 해주기 때문에
코드 관리적 측면에서도 훨씬 좋아집니다.

간단히 이것을 이해하기 위해 많이 쓰는 메소드 중 하나인 CCSprite::spriteWithFile 메소드를 열어보겠습니다.
### cpp
CCSprite* CCSprite::spriteWithFile(const char *pszFileName)
{
    CCSprite *pobSprite = new CCSprite();
    if (pobSprite && pobSprite->initWithFile(pszFileName))
    {
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);
    return NULL;
}
spriteWithFile 메소드에서는 CCSprite를 생성하고 그것에 그림을 입힌 뒤에 autorelease()를 걸어주고 객체를 반환해줍니다. 
그림을 입히고 autorelease()를 걸어주는 일련의 작업을 한 메소드 안에서 해주기 때문에 보기에도, 쓰기에도 좋아지는 것입니다.

참고로 이 팩토리 패턴 함수들은 클래스에 static 멤버 함수들로 정의되기 때문에
객체를 생성하지 않더라도 쓸 수 있는 메소드가 되게 되는 것입니다.
여러분들이 cocos2d-x의 객체들을 상속받아 새로운 클래스를 만들 때에도 이렇게 팩토리 패턴을 적용하여 만든다면
코드를 작성하고 관리하는데 있어 좀 더 유리하지 않을까요? 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday