在 C++ 中获取工厂 class 的用户输入
Get the user input for factory class in C++
在工厂设计中,当我用工厂 class 创建新对象时,我要求用户 his/her 输入,然后在工厂 class 中从用户那里获取输入使用这些输入创建对象。
在工厂中获取用户输入是否可行class?
我应该如何在工厂中获取用户输入 class?
工厂class在下方;
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());
}
}}
工厂中的输入函数之一class;
float Factory::getUserValue(){
float m;
std::cout<<"\n enter value:";
std::cin>>m
return m; }
正如其他人所建议的那样,如果需要,您的工厂可以采用输入参数来确定要创建的实例。例如,对于创建不同形状的简单形状工厂,您可以使用一个字符串/枚举来确定要创建的形状。但我强烈建议您的工厂 returns Unique Ptr by value to those instances,这被称为 sink,这样内存现在由请求者管理和拥有。
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;
}
};
简短回答:不,不要在工厂中获取用户输入 class。
长答案:如果没有更多的上下文(例如项目规模会很有趣),很难对单个 class 的一部分给出建议。但是,请考虑 Single Responsibility Principle, one of the SOLID 原则。
它告诉我们给一个模块/class/函数恰好一个责任。因此,如果您有一个 class 工厂(一个责任)并读取用户的输入(第二个责任),则违反了该原则。
相反,您应该想到与此类似的东西
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);
这样做你遵循了另一个重要原则,Separation Of Concerns。
但是,再说一次,我无法告诉你什么是最适合你的情况,因为我不了解整个情况。你会发现 ;-)
在工厂设计中,当我用工厂 class 创建新对象时,我要求用户 his/her 输入,然后在工厂 class 中从用户那里获取输入使用这些输入创建对象。
在工厂中获取用户输入是否可行class? 我应该如何在工厂中获取用户输入 class?
工厂class在下方;
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());
}
}}
工厂中的输入函数之一class;
float Factory::getUserValue(){
float m;
std::cout<<"\n enter value:";
std::cin>>m
return m; }
正如其他人所建议的那样,如果需要,您的工厂可以采用输入参数来确定要创建的实例。例如,对于创建不同形状的简单形状工厂,您可以使用一个字符串/枚举来确定要创建的形状。但我强烈建议您的工厂 returns Unique Ptr by value to those instances,这被称为 sink,这样内存现在由请求者管理和拥有。
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;
}
};
简短回答:不,不要在工厂中获取用户输入 class。
长答案:如果没有更多的上下文(例如项目规模会很有趣),很难对单个 class 的一部分给出建议。但是,请考虑 Single Responsibility Principle, one of the SOLID 原则。
它告诉我们给一个模块/class/函数恰好一个责任。因此,如果您有一个 class 工厂(一个责任)并读取用户的输入(第二个责任),则违反了该原则。
相反,您应该想到与此类似的东西
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);
这样做你遵循了另一个重要原则,Separation Of Concerns。
但是,再说一次,我无法告诉你什么是最适合你的情况,因为我不了解整个情况。你会发现 ;-)