通过传递不同的参数创建对象

时间:2018-04-03 16:35:51

标签: c++ oop design-patterns

我有一个像这样的插值器的类层次结构:

class BaseInterpolator
{
public:
    virtual ~BaseInterpolator();

    virtual float GetInterpolation(const float input) const = 0;
};

class AccelerateInterpolator : public BaseInterpolator
{
public:
    explicit AccelerateInterpolator(const float factor = 1.0f);
    virtual float GetInterpolation(const float input) const override;
private:
    float m_factor;
};

class AnticipateOvershootInterpolator : public BaseInterpolator
{
public:
    explicit AnticipateOvershootInterpolator(const float tension = 2.0f, const float extraTension = 1.5f);
    virtual float GetInterpolation(const float input) const override;
private:
    float m_tension;
    float m_extraTension;
};

我希望能够使用不同的参数构造这些对象。但是,BaseInterpolator的每个可能派生类型的参数数量不同,即AccelerateInterpolator有1,AnticipateOvershootInterpolator有2.我还有类抽象属性,客户端传递给我的库,根据这些属性创建插值器:

struct AnimationProperties
{
    enum class Curve
    {
        Accelerate,
        AnticipateOvershoot,
    };

    Curve curve;
    uint32_t duration{ 0 };
};

我想为用户添加通过AnimationProperties传递不同参数的可能性,因此我可以使用这些参数创建参数化插值器。到目前为止,我已经使用了非参数化插值器。我不知道该如何处理这个问题。我应该以某种方式使用访客,或者正确的方法是什么?

顺便说一下。用户只能看到AnimationProperties

1 个答案:

答案 0 :(得分:2)

您需要Factory Design Pattern - 甚至Abstract Factory

保持命名方案 - 它应如下所示:

class BaseInterpolatorFactory
{
public:
    virtual ~BaseInterpolatorFactory() = default;
    virtual std::unique_ptr<BaseInterpolator> CreateObject() = 0;
};

E.g。 AnticipateOvershootInterpolator的实施:

class AnticipateOvershootInterpolatorFactory : public BaseInterpolatorFactory
{
public:
    AnticipateOvershootInterpolatorFactory (float tension, float extraTension);
    std::unique_ptr<BaseInterpolator> CreateObject() override
    {
         return std::make_unique<>(m_tension, m_extraTension);
    }
private:
    float m_tension;
    float m_extraTension;
};

所以 - 在客户端代码中,不要传递一些参数的组合结构/联合/鉴别器 - 只需传递BaseInterpolatorFactory&