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