获取C 工厂类的用户输入

Get the user input for factory class in C++

本文关键字:用户 输入 工厂 获取      更新时间:2023-10-16

在出厂设计中,当我使用工厂类创建新对象时,我会向用户输入他/她的输入,并从工厂类中获取用户的输入,之后我用这些输入。

获得工厂类中的用户输入是否可行?我应该如何获得工厂类中的用户输入?

下面的工厂课程;

   Type *Factory::create_type(int Type){
switch(Type){
    case 1:{
        return new A(this->getUserTime(),this->getUserValue());
    }
    case 2:{
        float min = this->getUserMin();
        float max = this->getUserMax();
        if(this->validMinMax(min,max))
            return new B(this->getUserSpeed(),this >getUserValue(),min,max);
        else 
            return NULL;
    }
    case 3:{
        float min = this->getUserMin();
        float max = this->getUserMax();
        if(this->validUserMinMax(max,min))
            return new C(this->getUserSpeed(),this->getUserValue(),max,min);
        else 
            return NULL;
    }
    case 4:{
        return new D(this->getUserDistance(),this->getUserSpeed(),this->getUserValue());
    }
}}

工厂类中的输入功能之一;

float Factory::getUserValue(){
float m;
std::cout<<"n enter value:";
std::cin>>m
return m; }

简短答案:不,不要在工厂类中获取用户输入。

长答案:没有更多上下文(例如,项目规模很有趣),很难为单个类的一部分提供建议。但是,考虑到单一的责任原则,是坚实的原则之一。

它告诉我们一个模块/class/function完全一个责任。因此,如果您的课程是工厂(一个责任)并读取用户的输入(第二个责任),则该原则被违反。

相反,您应该考虑与此类似的东西

Type *Factory::create_type(int Type, const UserInput &input)
{
    switch (Type)
    {
        case 1:
            return new A(input.getTime(), input.getValue());
        case 2:
            float min = input.getMin();
            float max = input.getMax();
            /* and so on */
    }
}

和一些

class UserInput
{
    public:
        Time getTime() const;
        float getMin() const;
        float getMax() const;
        /* and so on */
};

或者,工厂可以将UserInput作为构造函数参数,因此称为

UserInput input;
// read input
auto Instance = Factory(input).create_type(3);

这样做,您遵循另一个重要的原则,即关注的分离。

但是,我再也不能告诉您您情况下最好的事情,因为我不知道整个情况。您会发现; - )

正如其他人建议的那样,如果需要的话,您的工厂可以使用输入参数来确定要创建的实例。例如,对于创建不同形状的简单形状工厂,您可以采用确定要创建哪种形状的字符串/枚举。但是我强烈建议您的工厂按价值返回独特的PTR,这称为接收器,以便现在由请求者管理和拥有内存。

class Shape
{
public:
    virtual ~Shape() {}
    virtual void draw() = 0;
};
class Circle : public Shape
{
public:
    virtual void draw() override { // Implementation }
};
class Square : public Shape
{
public:
    virtual void draw() override { // Implementation }
};

class ShapeFactory
{
public:
    std::unique_ptr<Shape> createShape(const std::string& shapeType)
    {
        if(shapeType == "Circle")
            return std::make_unique<Circle>();
        else if(shapeType == "Square")
            return std::make_unique<Square>();
        else
            return nullptr;
    }
};