Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用factory方法创建不同的对象_C++ - Fatal编程技术网

C++ 如何使用factory方法创建不同的对象

C++ 如何使用factory方法创建不同的对象,c++,C++,我看过工厂的设计模式,有点怀疑, 我在寄存器函数中看到的代码 他们在注册时将对象存储在地图中,第一次创建对象并将其存储在容器类中,每当我们需要从factory::getObjectRectangle请求的对象时,该矩形在注册期间已创建并存储在地图中,每当我调用getObjectRectangle时,它们都会返回这个对象 我的怀疑是每次我只得到同一个物体, 如果我想为矩形创建10个不同的对象 如何创建此矩形的10个diff对象 提前谢谢 RangeRingsFactory::RangeRingsF

我看过工厂的设计模式,有点怀疑, 我在寄存器函数中看到的代码

他们在注册时将对象存储在地图中,第一次创建对象并将其存储在容器类中,每当我们需要从factory::getObjectRectangle请求的对象时,该矩形在注册期间已创建并存储在地图中,每当我调用getObjectRectangle时,它们都会返回这个对象

我的怀疑是每次我只得到同一个物体, 如果我想为矩形创建10个不同的对象

如何创建此矩形的10个diff对象

提前谢谢

RangeRingsFactory::RangeRingsFactory()
{
    Register("Big", &Picture::Create);            //picure & picyureInPicture inherited from IRangeRings 
    Register("Small", &PictureInPicture::Create);
}

RangeRingsFactory *RangeRingsFactory::Get()
{
    static RangeRingsFactory instance;
    return &instance;
}
void RangeRingsFactory::Register(const string &Name, CreateRRFn pfnCreate)
{
    map1[Name] = pfnCreate;
}

IRangeRings *RangeRingsFactory::CreateRR(const string &Name)
{
     FactoryMap::iterator it = map1.find(Name);
            if( it != map1.end() )
                   return it->second();
            return NULL;

}
图片:

Picture::Picture():IRangeRings()
{
    setRangeScale(QRect(-200,-200,400,400));
}
IRangeRings *Picture::Create()
{
    return new Picture();
}
主要内容:


似乎您正在考虑原型和工厂模式的组合。工厂允许客户端注册原型实例,原型实例可能是某些公共基的子类。然后getObject方法生成所请求原型的副本

<>我为原型模式C++做了一个快速谷歌…以下是众多结果中的两个:

下面是一个使用基类shape和两个子类rectangle和circle的简单示例。这些类做的不多,但它们具有说明模式的最小结构

警告:我实际上并没有编译这个,所以如果我犯了任何简单的错误,请让我休息一下


注意:我知道有很多方法可以改进这段代码,但我尽量保持简单,以避免从关键点分散注意力。

工厂将字符串映射存储到创建函数。在其构造函数中,它注册了其中两个:大的对应于Picture::Create,小的对应于PictureInPicture::Create

CreateRR方法查找给定的名称,调用相应的创建函数,并返回其结果

只要Picture::Create和PictureInPicture::Create都生成新对象,每次调用CreateRR时都会得到一个新对象

所以事实上你已经

两个工厂函数——Picture::Create和PictureInPicture::Create——每个函数始终创建相同类型的对象

一个工厂类-RangeRingsFactory-对Picture和PictureInput隐藏特定类型,这样您就可以简单地按名称(大或小)请求一个,而不知道或关心生成的特定对象类型

解决方案A 如果在创建IRangeRings时设置不同的rect,那么IRangeRings中的rect将不同

更改这些功能:

CreateRRFn()
IRangeRings *RangeRingsFactory::CreateRR(const string &Name)
IRangeRings *Picture::Create()
致:

然后使用RangeRingsFactory实例创建新的irangering,如下所示:

IRangeRings *p1 = RangeRingsFactory::Get()->CreateRR("Big", QRect(0, 0, 100, 100));
解决方案B 你也可以在IRangeRings中添加一个新的纯虚函数,我认为IRangeRings是一个接口类,我把它命名为ToSetRangeScale。 而Picture和PictureInPicture必须实现它:

void Picture::ToSetRangeScale(const QRect &rect) { setRangeScale(rect); }
void PictureInPicture::ToSetRangeScale(const QRect &rect) { setRangeScale(rect); }
然后在创建Picture或PictureInPicture对象后,调用eTrangeScale设置rect:

最后
RangeRingsFactory存储Create函数的一些指针。相同的函数可以创建具有相同类的不同对象。不同的函数可以创建具有不同类的不同对象。如果要更改新对象的属性,可以在创建对象时设置属性,也可以在使用新方法创建对象后设置属性。

我想您没有阅读过有关factory方法的内容。。可能是2种或更多设计模式的混合。。这个链接可能会帮助您..我想您只需要通过Factory::getObject获得一个模板对象。您需要通过它创建一个新对象。你能添加你在quest中提到的工厂设计模式的链接吗?hai Alex Chi,我通过阅读代码来发布我的帖子,你可以看一看,谢谢。假设PictureInPicture::Create将返回PictureInPicture的对象指针。p1是图片对象的指针。p2是PictureInput对象的指针。所以p1和p2是不同的。
CreateRRFn(QRect rect)
IRangeRings *RangeRingsFactory::CreateRR(const string &Name, const QRect &rect)
IRangeRings *Picture::Create(const QRect &rect)
IRangeRings *p1 = RangeRingsFactory::Get()->CreateRR("Big", QRect(0, 0, 100, 100));
void Picture::ToSetRangeScale(const QRect &rect) { setRangeScale(rect); }
void PictureInPicture::ToSetRangeScale(const QRect &rect) { setRangeScale(rect); }
IRangeRings *p1 = RangeRingsFactory::Get()->CreateRR("Big");
p1->ToSetRangeScale(QRect(0, 0, 100, 100));