获取C 工厂类的用户输入
Get the user input for factory class in C++
在出厂设计中,当我使用工厂类创建新对象时,我会向用户输入他/她的输入,并从工厂类中获取用户的输入,之后我用这些输入。
获得工厂类中的用户输入是否可行?我应该如何获得工厂类中的用户输入?
下面的工厂课程;
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;
}
};
相关文章:
- C++如何通过用户输入删除列表元素
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 打印时有二叉树问题.用户输入不打印任何内容
- C ++奇怪的数组由用户输入
- 如何允许大写和小写用户输入?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用用户输入变量制作二维数组?
- 用户输入字符串的文件附加问题..C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?