设计模式一日一练:工厂模式(Factory)

    Factory模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。

/*
 * file: Factory.h
 * brief: Created by night at 2014.04.16
 */
 
#ifndef __FACTORY_H__
#define __FACTORY_H__

#include "Singleton.h"
//#include "Entity.h"

class Entity
{
    // ...
}

bool IsPlayer(int id) {
    return id < 65536;
}

bool IsNPC(int id) {
    return id > 65536 && id < 131072;
}

bool IsMonster(int id) {
    return id > 131072 && id < 196608;
}


class EntityFactory : public Singleton
{
    public:
        EntityFactory();
        ~EntityFactory();
        
        virtual Entity* CreateEntity(int id);
        Entity* CreatePlayer();
        Entity* CreateNPC();
        Entity* CreateMonster();
};

#endif

/*
 * file: Factory.cpp
 * brief: Created by night at 2014.04.16
 */
 
#include "Factory.h"

Entity* EntityFactory::CreateEntity(int id)
{
    if (IsPlayer(id))
        return EntityFactory::Instance()->CreatePlayer(id);
    else if (IsNPC(id))
        return EntityFactory::Instance()->CreateNPC(id);
    else if (IsMonster(id))
        return EntityFactory::Instance()->CreateMonster(id);
    return null;
}

Entity* EntityFactory::CreatePlayer(int id)
{
}

Entity* EntityFactory::CreateNPC(int id)
{
}

Entity* EntityFactory::CreateMonster(int id)
{
}


    利用Factory模式,可以很方便的扩展或者修改Factory生产的产品。比如:

class MyEntityFactory : public EntityFactory
{
    public:
        Entity* CreateEntity(int id);
        Entity* CreateRobot(int id);
}

Entity* MyEntityFactory::CreateEntity(int id)
{
    if (IsPlayer(id))
        return EntityFactory::Instance()->CreateNPC(id);
    else if (IsNPC(id))
        return EntityFactory::Instance()->CreateMonster(id);
    else if (IsRobot(id))
        return MyEntityFactory::Instance()->CreateRobot(id);
    // ...
    
    return EntityFactory::Instance()->CreateEntity(id);
}

    PS. 我的设计模式系列blog, 《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值