<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Design Pattern]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>was ich vor habe ist folgendes:</p>
<p>ich habe verschiedene Algorithmen zum verschluesseln, Hash generienern und zum Encoden. Jetzt moechte ich einen Layer erstellen der alles bereit stellt und auch waehrend der Laufzeit dynamisch erweitert werden kann.</p>
<p>Ich hab mir das so vorgestellt das es z.B. eine Funktion gitb mit der man einen Algorithmus registrieren kann mit Name + Funktion die eine solche Klasse erstellt. Desweiteren gibt es eine Funktion &quot;GetCrypter&quot; z.B. die dann den Namen des benoetigten Crypter braucht und dann ein Objekt davon erzeugt.</p>
<p>Waere das von der Theorie her ok? Und wenn ja was is das dann fuer ein Pattern (Builder, factory..)</p>
<p>Hier hab ich jetzt noch versucht ein kleines UML Diagramm zu erstellen (muss sagen is schon laenger her das wir das in der Schule gemacht habe)</p>
<pre><code>+-----------------------------------+
|  SecurityLayer   				|
|  -------------					|
| + RegisterCrypter				|
| + RegisterHash					|
| + ...							|
| + GetCrypter: Crypter			|
| + ....							|
+-----------------------------------+

+-----------------------------------+
|  Crypter (abstract)				|
|  -------------					|
| +Encrypt=0						|
| +Decrypt	=0						|
| + GetName		=0					|
+-----------------------------------*
			^
			|
			|
+-----------------------------------+
|  XOR								|
|  -------------					|
| methoden implementieren			|
+-----------------------------------+
</code></pre>
<p>Was auch noch schoen waere wenn einer Links mit guten Erklaerungen + C++ Beispile fuer die einzelnen Pattern haette.</p>
<p>Greetz C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282017/design-pattern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 08:56:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282017.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Feb 2011 10:04:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design Pattern on Sat, 12 Feb 2011 10:04:15 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>was ich vor habe ist folgendes:</p>
<p>ich habe verschiedene Algorithmen zum verschluesseln, Hash generienern und zum Encoden. Jetzt moechte ich einen Layer erstellen der alles bereit stellt und auch waehrend der Laufzeit dynamisch erweitert werden kann.</p>
<p>Ich hab mir das so vorgestellt das es z.B. eine Funktion gitb mit der man einen Algorithmus registrieren kann mit Name + Funktion die eine solche Klasse erstellt. Desweiteren gibt es eine Funktion &quot;GetCrypter&quot; z.B. die dann den Namen des benoetigten Crypter braucht und dann ein Objekt davon erzeugt.</p>
<p>Waere das von der Theorie her ok? Und wenn ja was is das dann fuer ein Pattern (Builder, factory..)</p>
<p>Hier hab ich jetzt noch versucht ein kleines UML Diagramm zu erstellen (muss sagen is schon laenger her das wir das in der Schule gemacht habe)</p>
<pre><code>+-----------------------------------+
|  SecurityLayer   				|
|  -------------					|
| + RegisterCrypter				|
| + RegisterHash					|
| + ...							|
| + GetCrypter: Crypter			|
| + ....							|
+-----------------------------------+

+-----------------------------------+
|  Crypter (abstract)				|
|  -------------					|
| +Encrypt=0						|
| +Decrypt	=0						|
| + GetName		=0					|
+-----------------------------------*
			^
			|
			|
+-----------------------------------+
|  XOR								|
|  -------------					|
| methoden implementieren			|
+-----------------------------------+
</code></pre>
<p>Was auch noch schoen waere wenn einer Links mit guten Erklaerungen + C++ Beispile fuer die einzelnen Pattern haette.</p>
<p>Greetz C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019984</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Sat, 12 Feb 2011 10:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Sat, 12 Feb 2011 10:40:28 GMT]]></title><description><![CDATA[<p>Die Aufgabe klingt nach dem Strategy Pattern. Siehe z. B. <a href="http://www.c-plusplus.net/forum/155350" rel="nofollow">im Magazin</a>. Du kannst den Crypter auch als Template-Parameter übergeben, wenn er sich für eine Instanz nicht ändert. Das läuft dann unter dem Namen <a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">Policy-based Design</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019995</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 12 Feb 2011 10:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Sat, 12 Feb 2011 20:35:13 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Die Aufgabe klingt nach dem Strategy Pattern. Siehe z. B. <a href="http://www.c-plusplus.net/forum/155350" rel="nofollow">im Magazin</a>. Du kannst den Crypter auch als Template-Parameter übergeben, wenn er sich für eine Instanz nicht ändert. Das läuft dann unter dem Namen <a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">Policy-based Design</a>.</p>
</blockquote>
<p>Danke schon mal.<br />
Ich hab mir des jetzt mal angeschaut,<br />
Zum Strategy Pattern: also so wie ich des verstanden habe passt das nicht so richtig, da ich ja ein Layer zur verfuegung stellen will der halt verschiedene Algorithmen (Verschluesselung, Hash, Encoding) beinhaltet. Dieser soll schon ein paar beinhalten wie z.B. XOR, base64 und MD5. Dieser Layer soll in einem Programm zur verfuegung gestellt werden der Hauptsaechlich ueber Plug-Ins gesteuert wird. Und diese sollen z.B. auch neue Verschluesselungen registrieren koennen mit dennen dann alle arbeiten koennen.</p>
<p>Und beim Strategy Pattern hab ich doch eine Instanz einer Klasse(zB. Crypter::XOR) die ich dann einer anderen Klasse(z.B. FileManager Plugin) uebergebe und die mit dieser arbeitet</p>
<p>Und zum Policy-baded Design: ist eig au schlecht da ich den Plugins die Moelgichkeit zur verfuegung stellen will, entweder aus den verschiedenen Arten auszuwaehlen oder halt verschiedene Algorithmen fuer verschiedene Aufgaben verwenden lassen will.</p>
<p>Hmm ich hoffe es kommt alles rueber was ich machen moechte.</p>
<p>Greetz C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020263</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Sat, 12 Feb 2011 20:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Sat, 12 Feb 2011 21:11:59 GMT]]></title><description><![CDATA[<p>So ganz verstehe ich deine Bedenken ehrlich gesagt nicht.</p>
<p>Ich zeig dir ein Beispiel, das du schon kennst. Das ist die Deklaration von std::vector:</p>
<pre><code class="language-cpp">template &lt; class T, class Allocator = allocator&lt;T&gt; &gt; class vector;
</code></pre>
<p>Was du vorhast, geht analog zum Allocator-Template-Parameter. Der std::vector braucht eine Strategie, um Speicher anfordern zu können. Um diese Wahl dem Nutzer zu überlassen, gibt es dafür einen Template-Parameter. Das Analogon wäre in deinem Fall die Hash-Strategie.</p>
<p>Die Standardbibliothek gibt zudem einen Default-Allokator mit, den der User benutzen kann. Das möchtest du mit ein paar Hash-Algorithmen ebenfalls machen, indem du die entsprechenden Klassen einfach mitlieferst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020278</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 12 Feb 2011 21:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Mon, 14 Feb 2011 10:02:11 GMT]]></title><description><![CDATA[<blockquote>
<p>So ganz verstehe ich deine Bedenken ehrlich gesagt nicht.</p>
</blockquote>
<p>Naja, wenn er das ganze pluginbasiert aufziehen will, aendern sich die möglichen Varianten zur Laufzeit. Bei nem Template muessen die zur compilezeit feststehen.</p>
<p>Ergo, Template und Plugin beissen sich schon bissi in der Beziehung.<br />
Oder überzeug mich vom gegenteil und bau ne vector template implementierung, wo ich den Allokator über nen plugin zur verfuegung stellen kann, das geladen werden kann aber nicht muss, bzw der user beim start des Programms festlegen kann, welcher allokator in allen vectoren verwendet wird, und trotzdem der allokator ueber nen template parameter festgelegt werden soll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020727</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 14 Feb 2011 10:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Mon, 14 Feb 2011 11:03:50 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Ergo, Template und Plugin beissen sich schon bissi in der Beziehung.<br />
Oder überzeug mich vom gegenteil und bau ne vector template implementierung, wo ich den Allokator über nen plugin zur verfuegung stellen kann, das geladen werden kann aber nicht muss, bzw der user beim start des Programms festlegen kann, welcher allokator in allen vectoren verwendet wird, und trotzdem der allokator ueber nen template parameter festgelegt werden soll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
</blockquote>
<p>Easy. Du machst nen allocator der intern eben polymorph den echten allokator verwendet. Deshalb kannst du zB einen allocator beim ctor von vector angeben.</p>
<p>bzw. ist das ganze deshalb illegal weil ein allocator keinen internen state haben darf - aber das ist ein design fehler der library und kein technisches hindernis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020745</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 14 Feb 2011 11:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Mon, 14 Feb 2011 12:08:44 GMT]]></title><description><![CDATA[<p>Du hast zwei Baustellen. Zum einen wendest du ein Verhaltensmuster an, nämlich Strategie.</p>
<pre><code class="language-cpp">class Crypter;
class Client
{
public:
    void read(Crypter&amp; c);  // strategy
};
</code></pre>
<p>Auf der anderen Seite steht die Frage nach der Erzeugung oder Verwaltung der Strategien. Hier ist ein Erzeugungsmuster gefragt. Deine Vorstellung geht denke ich in Richtung Fabrik.</p>
<pre><code class="language-cpp">namespace SecurityLayer
{

class CrypterFactory
{
public:
    typedef Crypter* (*Creator)();
    void RegisterCrypter(const std::string&amp; name, Creator f);
    Crypter* CreateCrypter(const std::string&amp; name);
};

// oder Erzeugung mit Prototype Pattern
class CrypterRepository
{
public:
    void RegisterCrypter(const std::string&amp; name, Crypter* prototype);
    Crypter* CreateCrypter(const std::string&amp; name);
};

}
</code></pre>
<p>Alle Fabriken für Crypt, Hash usw. in einer Klasse SecurityLayer zu sammeln halte ich für sinnlos. Sieht nach Ordnungswahn aus, &quot;toll, ich habe alles an einer Stelle&quot;. So eine Bündelung von Abhängigkeiten ist aber gerade zu vermeiden. Mach aus Klasse einen Namensraum um die Zusammengehörigkeit in einem Layer aufzuzeigen. Anders sieht es aus, wenn SecurityLayer eine <em>abstrakte Fabrik</em> darstellt, die austauschbar ist und jeweils zusammengehörende Strategien erzeugt.</p>
<pre><code class="language-cpp">class Hasher;
class AbstractSecurityFactory
{
public:
    virtual Crypter* CreateCrypter() = 0;
    virtual Hasher* CreateHasher() = 0;
};

class ABCSecurityFactory : public AbstractSecurityFactory
{
public:
    ABCCrypter* CreateCrypter();
    ABCHasher* CreateHasher();
};
class XYZSecurityFactory : public AbstractSecurityFactory
{/*..*/};

class Client
{
public:
    void ChangeSecurity(AbstractSecurityFactory&amp;);
};
</code></pre>
<p><a href="http://de.wikipedia.org/wiki/Abstrakte_Fabrik" rel="nofollow">http://de.wikipedia.org/wiki/Abstrakte_Fabrik</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020765</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 14 Feb 2011 12:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Mon, 14 Feb 2011 15:22:59 GMT]]></title><description><![CDATA[<p>Man könnte das auch als Decorator Pattern realisieren:</p>
<pre><code class="language-cpp">class IDataSink
{
   ...
   virtual void write( char* Data, unsigned int Size ) = 0;
   ...
};

class FileDataSink : public IDataSink
{
   // Daten in Datei schreiben
   void write( const char* Data, unsigned int Size );
};

class MemoryDataSink : public IDataSink
{
   // Daten in Puffer (Hauptspeicher) schreiben
   void write( const char* Data, unsigned int Size );
};

class HashDataSinkDecorator
{
   IDataSink&amp; DataSink_;

   HashDataSinkDecorator( IDataSink&amp; Sink ) :
      DataSink_( Sink )
   {
   }

   void write( char* Data, unsigned int Size )
   {
      // aus Daten Hash berechnen und Hash schreiben
      DataSink_.write( Hash, HashSize );
   }
};

int main()
{
   string s = &quot;Hello World&quot;;

   // File Sink zum Schreiben in Datei
   FileSink FS( &quot;c:/hash.dat&quot; );

   // Hash Sink zum Erzeugen eines Hashes
   HashDataSink HS( FS );
   HS.write( s.c_str(), s.size() );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2020852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020852</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 14 Feb 2011 15:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Mon, 14 Feb 2011 20:51:33 GMT]]></title><description><![CDATA[<p>Erst mal nochmal vielen dank fuer euer Antworten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>:</p>
<p>ich hab jetzt das hier geschrieben:</p>
<pre><code class="language-cpp">namespace security
{

template &lt;class T&gt;
class SecurityFactory
{
public:
	typedef T* (*GetInstance) ();
	typedef std::map&lt;std::string, GetInstance&gt;  AlgorithmMap;

	SecurityFactory(void) {};
	~SecurityFactory(void) {};

	bool AddAlgorithm(const std::string&amp; Name, GetInstance pfGetInstance)
	{
		if( AlgorithmExist(Name) )
			return false;

		m_AlgorithmMap[ Name ] = pfGetInstance;
		return true;
	}
	void RemoveAlgorithm(const std::string&amp; Name)
	{
		AlgorithmMap::iterator iter = m_AlgorithmMap.find( Name );

		if( iter != m_AlgorithmMap.end() )
			m_AlgorithmMap.erase( iter);
	}
	bool AlgorithmExist(std::string Name)
	{
		return (m_AlgorithmMap.find( Name) != m_AlgorithmMap.end() ) ? true : false;
	}

	T* Create(const std::string&amp; Name)
	{
		if( AlgorithmExist(Name) )
			return m_AlgorithmMap[Name]();
		return NULL;
	}

private:

	AlgorithmMap m_AlgorithmMap;
};

}
</code></pre>
<p>Seh ich das richtig so?<br />
Und dann einfach drei verschiedene Factories erstellen:</p>
<pre><code class="language-cpp">security::SecurityFactory&lt;security::encode::Encoder&gt; EncoderFactory;
security::SecurityFactory&lt;security::hash::Hash&gt; HashFactory;
security::SecurityFactory&lt;security::crypt::Crypter&gt; CrypterFactory;
</code></pre>
<p>Greetz C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021037</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Mon, 14 Feb 2011 20:51:33 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Tue, 15 Feb 2011 03:12:38 GMT]]></title><description><![CDATA[<p>Ich würde statt einem Funktionszeiger einen Zeiger auf eine abstrakte Factory-Klasse registrieren.<br />
Also</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class AbstractFactory
{
public:
    virtual T* CreateInstance() = 0;
};

class XxxFactoryDings
{
// ...

    void RegisterFactory(const std::string&amp; Name, AbstractFactory&lt;Foo&gt;* fooFactory);

// ...
};
</code></pre>
<p>Zwei andere Dinge die mit der Factory-Sache nix mehr zu tun haben und auch entschieden Ansichtssache sind: ich würde Smart-Pointer verwenden, und ich würde in den beiden Fällen &quot;Factory mit dem Namen ist bereits registriert&quot; und &quot;kann Objekt nicht erzeugt werden weil Factory mit dem Namen nicht bekannt&quot; Exceptions werfen antatt false bzw. nen NULL Pointer zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021138</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Feb 2011 03:12:38 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Tue, 15 Feb 2011 12:41:40 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich würde statt einem Funktionszeiger einen Zeiger auf eine abstrakte Factory-Klasse registrieren.<br />
Also</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class AbstractFactory
{
public:
    virtual T* CreateInstance() = 0;
};

class XxxFactoryDings
{
// ...

    void RegisterFactory(const std::string&amp; Name, AbstractFactory&lt;Foo&gt;* fooFactory);

// ...
};
</code></pre>
</blockquote>
<p>Meinste dann ca so:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class AbstractFactory
{
public:
	virtual T* Create() = 0;

};

class StrFactory : public AbstractFactory&lt;std::string&gt;
{
public:
	virtual std::string* Create() { return new std::string(&quot;test&quot;); };
};

int main(int argc, char** argv)
{
	std::vector&lt; AbstractFactory&lt;std::string&gt;* &gt; Vector;
	StrFactory StrFac;

	Vector.push_back( &amp;StrFac);

	std::cout &lt;&lt; (Vector[0]-&gt;Create())-&gt;c_str()  &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Und wo ist da der Vorteil gegenueber einer Create Funktion? Seh ich leider ned ganz.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Zwei andere Dinge die mit der Factory-Sache nix mehr zu tun haben und auch entschieden Ansichtssache sind: ich würde Smart-Pointer verwenden, und ich würde in den beiden Fällen &quot;Factory mit dem Namen ist bereits registriert&quot; und &quot;kann Objekt nicht erzeugt werden weil Factory mit dem Namen nicht bekannt&quot; Exceptions werfen antatt false bzw. nen NULL Pointer zurückzugeben.</p>
</blockquote>
<p>Also das mit den Smart Pointern werd ich mir halt jetzt doch mal anschauen. Hab bis jetzt immer versucht um boost drum rum zu kommen. Da ich denk des wird einige Zeit an einlesen kosten. Aber was solls. Kann ja eig nur Vorteile bringen :).</p>
<p>Und zu den Exceptions: Ich muss sagen ich find des ned so gut. Sagen wir ich lad ein PlugIn das registriert dein MD5 Alogrithmus da es diesen braucht. Jetzt lad ich spaeter ein neues PlugIn dazu das wiederrum auch MD5 benoetigt und das halt auch registrieren will. Jetzt muss er ja immer vorher checken ob der schon vorhanden ist.<br />
Ist doch einfacher so.<br />
Beim &quot;kann kein Objekt erzeugen&quot; find ichs an sich au gut. Mal schauen.</p>
<p>Greetz C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021240</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Tue, 15 Feb 2011 12:41:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Tue, 15 Feb 2011 12:55:19 GMT]]></title><description><![CDATA[<p>Ja, mein ich ca. so.</p>
<p>Vorteil: die Factory kann &quot;State&quot; halten. Und das kann aus den verschiedensten Gründen vorteilhaft sein.<br />
Man braucht es in vielen Programmen vielleicht nicht oft (oder gar nicht), aber wenn man es mal bräuchte, und es geht nicht, dann ist es richtig kacke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021244</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Feb 2011 12:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Tue, 15 Feb 2011 14:19:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ja, mein ich ca. so.</p>
<p>Vorteil: die Factory kann &quot;State&quot; halten. Und das kann aus den verschiedensten Gründen vorteilhaft sein.<br />
Man braucht es in vielen Programmen vielleicht nicht oft (oder gar nicht), aber wenn man es mal bräuchte, und es geht nicht, dann ist es richtig kacke.</p>
</blockquote>
<p>Joa warum dann nicht gleich besser machen des stimmt schon.</p>
<p>Ich hab jetzt mal beides umgesetzt und wollte fragen obste mal nen Blick drueber werfen koenntest:</p>
<pre><code class="language-cpp">namespace security
{

template &lt;class T&gt;
class SecurityFactory
{
public:
	typedef AbstractFactory&lt;T&gt; AlgorithmFactory;
	typedef std::map&lt;std::string, AlgorithmFactory*&gt;  AlgorithmMap;
	typedef std::vector&lt;std::string&gt; AlgorithmNameVec;
....
	bool AddAlgorithm(const std::string&amp; Name, AlgorithmFactory* Factory)
	{
		if( AlgorithmExist(Name) )
			return false;

		m_AlgorithmMap[ Name ] = Factory;
		return true;
	}
	....
	boost::shared_ptr&lt;T&gt; Create(const std::string&amp; Name)
	{
		if( AlgorithmExist(Name) )
			return m_AlgorithmMap[Name]-&gt;Create();

		throw &quot;Algorithm not found&quot;;
	}

private:

	AlgorithmMap m_AlgorithmMap;
};
</code></pre>
<p>und dann zB. so:</p>
<pre><code class="language-cpp">class HashFac : public AbstractFactory&lt;security::hash::Hash&gt;
{
public:
	boost::shared_ptr&lt; security::hash::Hash&gt; Create()
	{
		boost::shared_ptr&lt; security::hash::Hash&gt; Tmp( new security::hash::MD5 );
		return Tmp; 
	};
};

int main( int argc, char** argv)
{
	HashFac HashTmp;

	boost::shared_ptr&lt;security::hash::Hash&gt; HashPtr;
	security::SecurityFactory&lt;security::hash::Hash&gt; HashFactory;

	std::string test(&quot;lol armin stock&quot;);

	HashFactory.AddAlgorithm( &quot;md5&quot;, &amp;HashTmp);
	HashPtr = HashFactory.Create(&quot;md5&quot;);

	HashPtr-&gt;Update( (const BYTE*)test.c_str(), test.size() );
	HashPtr-&gt;Finish( );

	std::cout &lt;&lt; HashPtr-&gt;Hex() ;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2021299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021299</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Tue, 15 Feb 2011 14:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to Design Pattern on Tue, 15 Feb 2011 23:25:24 GMT]]></title><description><![CDATA[<p>Nur so nebenbei: Es gibt neben Funktionszeigern und polymorphen Interfaces noch eine weitere Lösung, bei der all der Boilerplate-Code von Klassen wegfällt und die trotzdem State haben kann: <code>std::tr1::function</code> . Lohnt sich vor allem, wenn man mit <code>bind()</code> Funktionsobjekte zusammenbastelt.</p>
<p>In C++0x gibts ausserdem noch Lambda-Ausdrücke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021623</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Feb 2011 23:25:24 GMT</pubDate></item></channel></rss>