« Patrons de conception/Fabrique abstraite » : différence entre les versions

Contenu supprimé Contenu ajouté
m robot Ajoute: ca:Abstract factory
Galanga (discussion | contributions)
→‎C++ : remplacé exemple avec usage étrange de auto_ptr (=>core...) par exemple venant de version anglaise de Wikipedia
Ligne 27 :
 
<source lang="cpp">
/* exemple d'une fabrique abstraite d'eléments d'IHM en C++ */
#include <memory>
using std::auto_ptr;
struct Button {
class Control { };
virtual void paint() = 0;
};
classstruct PushControlWinButton : public ControlButton { };
void paint (){
std::cout << " I'm a window button \n";
}
};
struct OSXButton : public Button {
class Factory {
void paint (){
public:
std::cout << " I'm a OSX button \n";
// Returns Factory subclass based on classKey. Each
}
// subclass has its own getControl() implementation.
};
// This will be implemented after the subclasses have
// been declared.
static auto_ptr<Factory> getFactory(int classKey);
virtual auto_ptr<Control> getControl() const = 0;
};
struct GUIFactory {
class ControlFactory : public Factory {
virtual Button* createButton () = 0;
public:
};
virtual auto_ptr<Control> getControl() const {
}
return auto_ptr<Control>(new PushControl());
struct WinGUIFactory : public GUIFactory {
Button* createButton (){
return new WinButton();
}
};
struct OSXGUIFactory : public GUIFactory {
Button* createButton (){
return new OSXButton();
}
};
struct Application {
Application(GUIFactory* factory){
Button * button = factory->createButton();
button->paint();
}
};
/* application : */
int main()
{
GUIFactory* factory1 = new WinGUIFactory();
GUIFactory* factory2 = new OSXGUIFactory();
Application* winApp = new Application (factory1);
Application* osxApp = new Application (factory2);
delete factory1, factory2;
return 0;
auto_ptr<Factory> Factory::getFactory(int classKey) {
}
// Insert conditional logic here. Sample:
switch(classKey) {
default:
return auto_ptr<Factory>(new ControlFactory());
}
}
</source>