Avatar billede rtfm_now Nybegynder
16. juli 2005 - 14:09 Der er 3 kommentarer

Simpelt factory i c++

Hej

Jeg leder efter en simpel Factory tutorial til c++, men kan ikke rigtig finde en.

Har arbejdet med factory i php, og lidt java, men c++ lader til at være en del anderledes, så hvis nogen kunne lave en extrem simpel factory, som kodeeksempel, ville det være rart.

På forhånd tak.
Avatar billede arne_v Ekspert
16. juli 2005 - 22:00 #1
Abstract Factory pattern eller Factory Method pattern ?

GoF bogen bruger eksempler i C++ så der er sikkert ikke noget bedre end den.

Googling finder bl.a.:

http://www.vico.org/pages/PatronsDisseny/Pattern%20Abstract%20Factory/
http://gsraj.tripod.com/design/creational/factory/factory.html
Avatar billede amma Nybegynder
21. juli 2005 - 19:36 #2
Du bør bemærke at en 'Factory' bare er en 'pattern'. Hvordan denne pattern bliver implementeret er op til den enkelte. Men lige-ud-af-hovedet:


struct CFactory
{

  struct SEntry
  {
    int  m_ID;
    void* (*m_pCreator)();
  }

  void Add( const SEntry& _entry)
  {
    /// test om entriet allerede eksisterer

    /// Gem nyt entry
    m_Entries.push_back( _entry );
  }

  template <class __Type>
  __Type* GetNew( int _id)
  {
    std::vector<SEntry>::iterator i = Find i vector;
    return reinterpret_cast< __Type* >(  (*i).m_pCreator  );
  }

std::vector<SEntry> m_Entries;
};


'CFactory' er nu en fuldblodig, og så simpel som mulig, factory.

For at 'adde' typer, bruger du 'Add' funktionen ala:


struct SMinKlasseDerSkalKunneLavesIEnFactory
{
  static void* GetNew()
  {
    return new SMinKlasseDerSkalKunneLavesIEnFactory;
  }
};

void Test()
{
  CFactory factory;

  /// Add et nyt entry
  CFactory::SEntry entry;
  entry.m_ID = 234324; /// eller et andet unikt id du selv finder på
  entry.m_pCreator = &SMinKlasseDerSkalKunneLavesIEnFactory::GetNew;
  factory.Add( entry );

  /// At lave objekter er nu så simpelt som ...
  SMinKlasseDerSkalKunneLavesIEnFactory* pNytObjektLavetAfFactory = factory.GetNew<SMinKlasseDerSkalKunneLavesIEnFactory>( 234324 );
}


Værsgo ... skriv endelig hvis der er noget, du ikke forstår ... og igen, det her er lavet 100% fra hovedet. Men princippet er helt korrekt.


Mvh.
Asger
Avatar billede bertelbrander Praktikant
23. juli 2005 - 20:08 #3
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester