设计模式以确保许多类的数据初始化

时间:2013-04-27 11:23:46

标签: design-patterns initialization

我正在制作塔防游戏。在创建关卡之前,我需要在内存中准备好关于怪物,塔等的统计数据。例如:

fastmonster.name = "Rabbit";
fastmonster.health = 100;
fastmonster.speed = 10;
slowmonster.name = "Turtle";
slowmonster.health = 500;
slowmonster.speed = 2;

塔和其他东西也一样。

(我还没有决定如何从文件中详细阅读。)

如何在创建怪物或塔类对象之前确保所有这些数据都已准备就绪?我正在寻找一种设计模式,它允许我全局初始化所有数据,并允许我使用常规构造函数创建怪物对象。同时,它应该确保在读取单位统计数据之前没有创建任何对象。

我确信这个问题已经解决了一百万次,但到目前为止我找不到任何真正适合这个问题的解决方案,并且不是一个具有多个抽象级别的超级复杂问题。

到目前为止我的解决方案

我将构造函数设为私有,并定义了一个create()函数,看起来像这个

Monster Monster::create (MonsterType type) {
    if (!initialized()) {
        initialize();
        initialized = true;
    }
    return new Monster(type);
}

现在的问题是我需要为塔和所有其他游戏元素创建相同的功能。这似乎有很多重复。

另一个想法

我将所有构造函数保密。创建一个(singleton?)工厂类并使其成为所有类的朋友,并让它创建所有对象。 Factory将在创建时进行初始化。

GOF模式

我看了其他创作图案,但似乎没有一个适合。或者我只是不太了解它们。

1 个答案:

答案 0 :(得分:0)

我认为你的解决方案很棒。

您可以使用模板方法 GOF模式对其进行改进,以避免重复。

不幸的是我不知道它是如何在c ++中实现的,但在c#中它可以是以下内容:

public abstract class BaseEntity<T>
{
    private bool initialized = false;

    public BaseEntity<T> Create(T typeOfEntity)
    {
        if (!Initialized())
        {
            Initialize();
            initialized = true;
        }

        return GetEntity(typeOfEntity);
    }

    protected abstract void Initialize();
    protected abstract bool Initialized();
    protected abstract BaseEntity<T> GetEntity(T typeOfEntity);
}

public class MonsterEntity:BaseEntity<MonsterType>
{
    //...

    public MonsterEntity(MonsterType typeOfEntity)
    {
        //...
    }

    protected override void Initialize()
    {
        //initialize logic
    }

    protected override bool Initialized()
    {
        bool initialized = false;

        //check for initialization

        return initialized;
    }

    protected override BaseEntity<MonsterType> GetEntity(MonsterType typeOfEntity)
    {
        return new MonsterEntity(typeOfEntity);
    }

    //...
}

您还可以为entites添加子类,并使方法GetEntity成为Fabric方法。