<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?action=history&amp;feed=atom&amp;title=Design_Patterns</id>
	<title>Design Patterns - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?action=history&amp;feed=atom&amp;title=Design_Patterns"/>
	<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Design_Patterns&amp;action=history"/>
	<updated>2026-04-14T05:23:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in CCWiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Design_Patterns&amp;diff=1761&amp;oldid=prev</id>
		<title>Drlue: /* Multithreading */</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Design_Patterns&amp;diff=1761&amp;oldid=prev"/>
		<updated>2021-03-10T13:11:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Multithreading&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 10. März 2021, 13:11 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l454&quot;&gt;Zeile 454:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 454:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wird nun der {{JSL|ImageLoader}} im Kontext von {{AL|Multithreading}} betrachtet, d.h. das Programm greift über verschiedene {{AL|Multithreading|Threads}} auf den {{JSL|ImageLoader}} zu, so ergibt sich ein Problem. Im folgenden ist der kritische Bereich des &amp;#039;&amp;#039;&amp;#039;Singleton&amp;#039;&amp;#039;&amp;#039; zu sehen:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wird nun der {{JSL|ImageLoader}} im Kontext von {{AL|Multithreading}} betrachtet, d.h. das Programm greift über verschiedene {{AL|Multithreading|Threads}} auf den {{JSL|ImageLoader}} zu, so ergibt sich ein Problem. Im folgenden ist der kritische Bereich des &amp;#039;&amp;#039;&amp;#039;Singleton&amp;#039;&amp;#039;&amp;#039; zu sehen:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|highlight=&amp;#039;2-3&amp;#039;|code=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|highlight=&amp;#039;2-3&amp;#039;|code=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/del&gt;public static ImageLoader getInstance() {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static ImageLoader getInstance() {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &lt;/del&gt;if(imageLoaderInstance == null) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/ins&gt;if(imageLoaderInstance == null) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/del&gt;imageLoaderInstance = new ImageLoader()&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &lt;/ins&gt;imageLoaderInstance = new ImageLoader();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    }&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    return imageLoaderInstance&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  return imageLoaderInstance;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wird von mehreren verschiedenen {{AL|Multithreading|Threads}} der Bereich in &amp;#039;&amp;#039;Zeile 10&amp;#039;&amp;#039; gleichzeitig betreten (solange noch keine &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; erstellt wurde), so können wieder mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; erstellt werden. Zwar wird nur die letzte &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; gespeichert und auch bei erneutem Aufruf zurückgegeben, jedoch können mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; im Umlauf sein. Dieses Problem kann über {{AL|Synchronisierung}} gelöst werden:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wird von mehreren verschiedenen {{AL|Multithreading|Threads}} der Bereich in &amp;#039;&amp;#039;Zeile 10&amp;#039;&amp;#039; gleichzeitig betreten (solange noch keine &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; erstellt wurde), so können wieder mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; erstellt werden. Zwar wird nur die letzte &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; gespeichert und auch bei erneutem Aufruf zurückgegeben, jedoch können mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; im Umlauf sein. Dieses Problem kann über {{AL|Synchronisierung}} gelöst werden:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|code=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|code=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/del&gt;public static synchronized ImageLoader getInstance() {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static synchronized ImageLoader getInstance() {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &lt;/del&gt;...&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/ins&gt;...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/del&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weiters sollte zusätzlich die {{AL|Methoden|Methode}} {{JSL|getImage(...)}} {{AL|Synchronisierung|synchronisiert}} werden. Wird das gleiche Bild aus unterschiedlichen {{AL|Multithreading|Threads}} geladen, so kann dies dazu führen, dass es zweimal geladen wird, was aber nicht nötig wäre:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weiters sollte zusätzlich die {{AL|Methoden|Methode}} {{JSL|getImage(...)}} {{AL|Synchronisierung|synchronisiert}} werden. Wird das gleiche Bild aus unterschiedlichen {{AL|Multithreading|Threads}} geladen, so kann dies dazu führen, dass es zweimal geladen wird, was aber nicht nötig wäre:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|code=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{JML|start=8|code=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/del&gt;public synchronized byte[] getImage(String url) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public synchronized byte[] getImage(String url) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &lt;/del&gt;...&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/ins&gt;...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/del&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Mit dem &amp;#039;&amp;#039;&amp;#039;Schlüsselwort&amp;#039;&amp;#039;&amp;#039; {{JSL|synchronized}} kommt immer ein &amp;#039;&amp;#039;&amp;#039;Performanceverlust&amp;#039;&amp;#039;&amp;#039; einher. Deswegen sollte genau abgewägt werden ob und wann es verwendet werden soll. In diesem Beispiel ist es vollkommen in Ordnung, da die Aufrufe der {{AL|Synchronisierung|synchronisierten}} {{AL|Methoden}} nicht 10000x pro Sekunde sein werden.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Mit dem &amp;#039;&amp;#039;&amp;#039;Schlüsselwort&amp;#039;&amp;#039;&amp;#039; {{JSL|synchronized}} kommt immer ein &amp;#039;&amp;#039;&amp;#039;Performanceverlust&amp;#039;&amp;#039;&amp;#039; einher. Deswegen sollte genau abgewägt werden ob und wann es verwendet werden soll. In diesem Beispiel ist es vollkommen in Ordnung, da die Aufrufe der {{AL|Synchronisierung|synchronisierten}} {{AL|Methoden}} nicht 10000x pro Sekunde sein werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Design_Patterns&amp;diff=1760&amp;oldid=prev</id>
		<title>Drlue: Die Seite wurde neu angelegt: „&#039;&#039;&#039;Design Patterns&#039;&#039;&#039; oder &#039;&#039;&#039;Entwurfsmuster&#039;&#039;&#039; in der Softwareentwicklung sind Vorlagen für gewisse Problemstellungen. Sie geben keine konkrete Implementieru…“</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Design_Patterns&amp;diff=1760&amp;oldid=prev"/>
		<updated>2021-03-10T12:49:22Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&amp;#039;&amp;#039;&amp;#039;Design Patterns&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; in der Softwareentwicklung sind Vorlagen für gewisse Problemstellungen. Sie geben keine konkrete Implementieru…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Design Patterns&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; in der Softwareentwicklung sind Vorlagen für gewisse Problemstellungen. Sie geben keine konkrete Implementierung vor, sondern lediglich eine Beschreibung wie ein gegebenes Problem gelöst werden soll. &amp;#039;&amp;#039;&amp;#039;Design Patterns&amp;#039;&amp;#039;&amp;#039; sind formalisierte &amp;#039;&amp;#039;&amp;#039;Best Practices&amp;#039;&amp;#039;&amp;#039; die den Weg für die Lösung vorgeben.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Software_design_pattern&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Best Practices&amp;#039;&amp;#039;&amp;#039;, sind erprobte Lösungen. So löst man etwas am besten.&lt;br /&gt;
Folgender Inhalt bezieht sich weitestgehended auf &amp;lt;ref name=&amp;#039;entwurfsmuster_von_kopf_bis_fuß&amp;#039;/&amp;gt;.&lt;br /&gt;
= Wichtige Entwurfsprinzipien =&lt;br /&gt;
Folgend sollen einige wichtige &amp;#039;&amp;#039;&amp;#039;Designprinzipien&amp;#039;&amp;#039;&amp;#039; erklärt werden. Werden diese angewendet, so kommt selbst ohne das Wissen über ein konkretes &amp;#039;&amp;#039;&amp;#039;Design Pattern&amp;#039;&amp;#039;&amp;#039; etwas ähnliches dabei raus.&lt;br /&gt;
==== Immer gegen eine Schnittstelle programmieren ====&lt;br /&gt;
Was bedeutet dies Konkret:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
}}&lt;br /&gt;
Anstatt bei der Variable {{JSL|ArrayList&amp;lt;String&amp;gt;}} zu verwenden, wird das {{AL|Interface}} verwendet. Dies bietet später die Möglichkeit, die &amp;#039;&amp;#039;&amp;#039;Implementierung&amp;#039;&amp;#039;&amp;#039; der {{JSL|List&amp;lt;String&amp;gt;}} zu ändern, beispielsweise auf eine {{JSL|LinkedList&amp;lt;String&amp;gt;}}.&lt;br /&gt;
 Wenn vom Programmieren gegen eine {{AL|Interface|Schnittstelle}} gesprochen wird, so kann es sich hierbei auch um eine {{AL|Abstrakte_Klasse|Abstrakte Klasse}} handeln, es muss nicht zwingend ein {{AL|Interface}} sein.&lt;br /&gt;
&lt;br /&gt;
==== Komposition ist der Vererbung vorzuziehen ====&lt;br /&gt;
[[Objektorientierte_Programmierung#Has_A|Komposition]] ist &amp;#039;&amp;#039;&amp;#039;viel flexibler&amp;#039;&amp;#039;&amp;#039; als die [[Objektorientierte_Programmierung#Is_A|Vererbung]]. Dadurch ist es möglich das Verhalten zur Laufzeit zu verändern, dadurch bringt es mehr Flexibilität.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vererbung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Vehicle {&lt;br /&gt;
  public void drive() {&lt;br /&gt;
     System.out.println(&amp;quot;I can drive&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Car extends Vehicle {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
In obigem Code ist ersichtlich, dass {{JSL|drive()}} zur Laufzeit nicht verändert werden kann. Dieser Code ist &amp;#039;&amp;#039;&amp;#039;unflexibel&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Komposition&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public interface CanDrive {&lt;br /&gt;
  public void drive();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class DriveBehaviour {&lt;br /&gt;
  public void drive() {&lt;br /&gt;
    System.out.println(&amp;quot;I can drive&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Car implements CanDrive {&lt;br /&gt;
  private DriveBehaviour driveBehaviour = new DriveBehaviour();&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void drive() {&lt;br /&gt;
    driveBehaviour.drive();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void setDriveBehaviour(DriveBehaviour driveBehaviour) {&lt;br /&gt;
    this.driveBehaviour = driveBehaviour;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
In genanntem Beispiel wurde nun {{JSL|drive()}} in eine eigene {{AL|Klasse}} {{JSL|DriveBehaviour}} ausgelagert. {{JSL|Car}} verwendet nun dieses Verhalten und es kann dynamisch getauscht werden.&lt;br /&gt;
 Was hier ersichtlich ist, ist eigentlich eine Schmalspurvariante des &amp;#039;&amp;#039;&amp;#039;Strategy Patterns&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Offen für Erweiterung aber geschlossen für Veränderung ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Code&amp;#039;&amp;#039;&amp;#039; soll so geschrieben werden, dass er &amp;#039;&amp;#039;&amp;#039;offen für Erweiterung&amp;#039;&amp;#039;&amp;#039; ist, d.h. neue Funktionalität kann hinzugefügt werden. Gleichzeitig soll er jedoch &amp;#039;&amp;#039;&amp;#039;geschlossen für Veränderung&amp;#039;&amp;#039;&amp;#039; sein, das bedeutet, wenn neue Funktionalität hinzugefügt wird, soll so wenig wie möglich am bestehenden &amp;#039;&amp;#039;&amp;#039;Code&amp;#039;&amp;#039;&amp;#039; geändert werden müssen.&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Schlussfolgerung die daraus getroffen werden kann:&lt;br /&gt;
 Trenne Code der sich ändert, von Code der sich nicht ändert.&lt;br /&gt;
&lt;br /&gt;
==== Lockere Kopplung ====&lt;br /&gt;
Wenn Objekte miteinander &amp;#039;&amp;#039;&amp;#039;interagieren&amp;#039;&amp;#039;&amp;#039; ist eine lockere Kopplung anzustreben. D.h. die interagierenden Objekte sind nicht fix miteinander verbunden und diese Verbindung kann zur Laufzeit geändert werden.&lt;br /&gt;
&lt;br /&gt;
= Auswahl von Design Patterns =&lt;br /&gt;
Im folgenden wird auf eine Auswahl von &amp;#039;&amp;#039;&amp;#039;Design Patterns&amp;#039;&amp;#039;&amp;#039; eingegangen, wobei eines davon in Wirklichkeit überhaupt keines ist, nämlich die {{Link|Simple_Factory|Simple Factory}}.&lt;br /&gt;
== Observer ==&lt;br /&gt;
 Das &amp;#039;&amp;#039;&amp;#039;Observer-Muster&amp;#039;&amp;#039;&amp;#039; definiert eine &amp;#039;&amp;#039;&amp;#039;Eins-zu-viele-Abhängigkeit&amp;#039;&amp;#039;&amp;#039; zwischen Objekten in der Art, dass alle abhängigen Objekte (&amp;#039;&amp;#039;&amp;#039;Beobachter&amp;#039;&amp;#039;&amp;#039;) benachrichtigt werden, wenn sich der Zustand des einen Objekts (&amp;#039;&amp;#039;&amp;#039;Subjekt - Beobachtetes Objekt&amp;#039;&amp;#039;&amp;#039;) verändert.&lt;br /&gt;
[[Datei:Observer.jpg|mini|ohne|600px|Beziehung zwischen Subjekt und Beobachtern&amp;lt;ref name=&amp;quot;entwurfsmuster_von_kopf_bis_fuß&amp;quot;/&amp;gt;]]&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Observer&amp;#039;&amp;#039;&amp;#039; Pattern soll im Folgenden anhand des Beispiels einer Wetterstation veranschaulicht werden. Folgende {{AL|Klasse}} ist gegeben, welche die Möglichkeit bietet die Wetterdaten abzurufen. Diese könnten Beispielsweise aus einem &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;oftware &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;evelopment &amp;#039;&amp;#039;&amp;#039;K&amp;#039;&amp;#039;&amp;#039;it bzw. einer &amp;#039;&amp;#039;&amp;#039;Bibliothek&amp;#039;&amp;#039;&amp;#039; kommen:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class WetterDaten {&lt;br /&gt;
  public float getTemperature() { ... }&lt;br /&gt;
  public float getLuftfeuchtigkeit() { ... }&lt;br /&gt;
  public float getLuftdruck() { ... }&lt;br /&gt;
  public void messwerteGeändert() {&lt;br /&gt;
    //Wird aufgerufen wenn die Messwerte geändert wurden&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Es spielt im obigen Code Beispiel keine Rolle wie die Wetterdaten erzeugt werden, es ist nur sicher, dass die Methode {{JSL|messwerteGeändert()}} aufgerufen wird, sobald sich irgendein Wert geändert hat. Nun werden einige Anzeigen für die Wetterstation erstellt:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class AktuelleBedingungenAnzeige {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class VorhersageAnzeige {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class StatistikAnzeige {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) { ... }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
In der {{AL|Klasse}} {{JSL|WetterDaten}} werden diese Anzeigen nun verwendet:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class WetterDaten {&lt;br /&gt;
  private AktuelleBedingungenAnzeige aktuelleBedingungenAnzeige = new AktuelleBedingungenAnzeige();&lt;br /&gt;
  private StatistikAnzeige vorhersageAnzeige = new StatistikAnzeige();&lt;br /&gt;
  private StatistikAnzeige statistikAnzeige = new StatistikAnzeige();&lt;br /&gt;
&lt;br /&gt;
  public float getTemperature() { ... }&lt;br /&gt;
  public float getLuftfeuchtigkeit() { ... }&lt;br /&gt;
  public float getLuftdruck() { ... }&lt;br /&gt;
&lt;br /&gt;
  public void messwerteGeändert() {&lt;br /&gt;
    float temp = getTemperatur();&lt;br /&gt;
    float feuchtigkeit = getLuftfeuchtigkeit();&lt;br /&gt;
    float druck = getLuftdruck();&lt;br /&gt;
&lt;br /&gt;
    aktuelleBedingungenAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
    vorhersageAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
    statistikAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Der aktuelle Entwurf von {{JSL|WetterDaten}} weist im folgenden Abschnitt Probleme auf:&lt;br /&gt;
{{JML|highlight=&amp;#039;1-3&amp;#039;|start=8|code=&lt;br /&gt;
aktuelleBedingungenAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
vorhersageAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
statistikAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
}}&lt;br /&gt;
* Dieser Teil kann sich ändern, wenn beispielsweise neue Anzeigen dazukommen, deswegen sollte der Code &amp;#039;&amp;#039;&amp;#039;gekapselt&amp;#039;&amp;#039;&amp;#039; werden. Siehe [[Design_Patterns#Offen_f.C3.BCr_Erweiterung_aber_geschlossen_f.C3.BCr_Ver.C3.A4nderung|Entwurfsprinzip]]&lt;br /&gt;
* Es wird gegen konkrete &amp;#039;&amp;#039;&amp;#039;Implementierungen&amp;#039;&amp;#039;&amp;#039; Programmiert nicht gegen eine &amp;#039;&amp;#039;&amp;#039;Schnittstelle&amp;#039;&amp;#039;&amp;#039;. Alle Anzeigen haben zwar die selbe {{JSL|aktualisieren(...)}} Methode, werden jedoch über die konkrete Implementierung angesprochen, die {{AL|Klasse|Klassen}} haben &amp;#039;&amp;#039;&amp;#039;keine Gemeinsamkeit&amp;#039;&amp;#039;&amp;#039;. Siehe [[Design_Patterns#Immer_gegen_eine_Schnittstelle_programmieren|Entwurfsprinzip]]&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Probleme können mit dem &amp;#039;&amp;#039;&amp;#039;Observer Pattern&amp;#039;&amp;#039;&amp;#039; gelöst werden, weiters erhält man durch die [[Design_Patterns#Lockere_Kopplung|Lockere Kopplung]] des &amp;#039;&amp;#039;&amp;#039;Musters&amp;#039;&amp;#039;&amp;#039; den weiteren Vorteil, dass die &amp;#039;&amp;#039;&amp;#039;Beobachter&amp;#039;&amp;#039;&amp;#039; zur Laufzeit hinzugefügt und entfernt werden können:&lt;br /&gt;
[[Datei:Observer pattern.jpg|600px|mini|ohne]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beobachter&amp;#039;&amp;#039;&amp;#039; können zur Laufzeit &amp;#039;&amp;#039;&amp;#039;registriert&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;entfernt&amp;#039;&amp;#039;&amp;#039; werden, dies bietet viel Flexibilität. Aus dem &amp;#039;&amp;#039;&amp;#039;Muster&amp;#039;&amp;#039;&amp;#039; leiten wir nun folgende &amp;#039;&amp;#039;&amp;#039;Implementierung&amp;#039;&amp;#039;&amp;#039; ab. (Der Einfachheit halber wird hier auf das {{AL|Interface}} {{JSL|Subjekt}} verzichtet):&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public interface Beobachter {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class AktuelleBedingungenAnzeige implements Beobachter {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) { &lt;br /&gt;
    System.out.println(&amp;quot;Das aktuelle Wetter: &amp;quot;+temp+&amp;quot;°C&amp;quot;);  &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class VorhersageAnzeige implements Beobachter {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) { &lt;br /&gt;
    System.out.println(&amp;quot;Das morgige Wetter: &amp;quot;+temp+&amp;quot;°C&amp;quot;);  &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class StatistikAnzeige implements Beobachter {&lt;br /&gt;
  public void aktualisieren(float temp, float humidity, float pressure) {&lt;br /&gt;
    System.out.println(&amp;quot;Das durchschnittliche Wetter: &amp;quot;+temp+&amp;quot;°C&amp;quot;);  &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class WetterDaten {&lt;br /&gt;
  private List&amp;lt;Beobachter&amp;gt; beobachter = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
  private float temp, humidity, pressure;&lt;br /&gt;
&lt;br /&gt;
  //Damit man das ganze auch ausprobieren kann&lt;br /&gt;
  public void setMessdaten(float temp, float humidity, float pressure) {&lt;br /&gt;
    this.temp = temp;&lt;br /&gt;
    this.humidity = humiditiy;&lt;br /&gt;
    this.pressure = pressure;&lt;br /&gt;
    aktualisiereBeobachter();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public float getTemperature() {&lt;br /&gt;
    return temp;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public float getHumidity() {&lt;br /&gt;
    return humiditiy;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public float getPressure() {&lt;br /&gt;
    return pressure;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void registriereBeobachter(Beobachter b) {&lt;br /&gt;
    if(!beobachter.contains(b)) {&lt;br /&gt;
      beobachter.add(b);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void entferneBeobachter(Beobachter b) {&lt;br /&gt;
    beobachter.remove(b);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void aktualisiereBeobachter() {&lt;br /&gt;
    float temp = getTemperatur();&lt;br /&gt;
    float feuchtigkeit = getLuftfeuchtigkeit();&lt;br /&gt;
    float druck = getLuftdruck();&lt;br /&gt;
&lt;br /&gt;
    for(Beobachter b : beobachter) {&lt;br /&gt;
      aktuelleBedingungenAnzeige.aktualisieren(temp, feuchtigkeit, druck);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Alle Anzeigen implementieren das {{AL|Interface}} {{JSL|Beobachter}}. {{JSL|WetterDaten}} hält eine Liste von &amp;#039;&amp;#039;&amp;#039;Beobachtern&amp;#039;&amp;#039;&amp;#039;. Im folgenden ersichtlich, die Verwendung der Wetterstation:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  //Erstellen des Observables, hier muss die konkrete Implementierung für den Variablen Typ verwendet werden,&lt;br /&gt;
  //da die Methode setMessdaten(...) benötigt wird&lt;br /&gt;
  WetterDaten wetterDaten = new WetterDaten();&lt;br /&gt;
&lt;br /&gt;
  //Erstellen der Anzeigen&lt;br /&gt;
  Beobachter aktuelleAnzeige = new AktuelleAnzeige();&lt;br /&gt;
  Beobachter vorhersageAnzeige = new VorhersageAnzeige();&lt;br /&gt;
  Beobachter statistikAnzeige = new StatistikAnzeige();&lt;br /&gt;
&lt;br /&gt;
  //Keine Beobachter vorhanden&lt;br /&gt;
  wetterDaten.setMessdaten(10, 90, 1080);&lt;br /&gt;
&lt;br /&gt;
  //Alle Anzeigen werden registriert&lt;br /&gt;
  wetterDaten.registriereBeobachter(aktuelleAnzeige);&lt;br /&gt;
  wetterDaten.registriereBeobachter(vorhersageAnzeige);&lt;br /&gt;
  wetterDaten.registriereBeobachter(statistikAnzeige);&lt;br /&gt;
&lt;br /&gt;
  //Aktuelle/Vorhersage und Statistik werden benachrichtigt&lt;br /&gt;
  wetterDaten.setMessdaten(12, 60, 1080);&lt;br /&gt;
&lt;br /&gt;
  //Statistik wird entfernt&lt;br /&gt;
  wetterDaten.entferneBeobachter(statistikAnzeige);&lt;br /&gt;
&lt;br /&gt;
  //Aktuelle und Vorhersage werden benachrichtigt&lt;br /&gt;
  wetterDaten.setMessdaten(21, 99, 1020);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Das finale &amp;#039;&amp;#039;&amp;#039;UML Klassendiagramm&amp;#039;&amp;#039;&amp;#039; obiger Implementierung sieht nun so aus:&lt;br /&gt;
[[Datei:Observer final.png|600px|mini|ohne|Finales UML Klassendiagramm der Implementierung]]&lt;br /&gt;
[[Datei:Observer final.dia.zip]]&lt;br /&gt;
&lt;br /&gt;
== Simple Factory ==&lt;br /&gt;
 Die &amp;#039;&amp;#039;&amp;#039;Simple Factory&amp;#039;&amp;#039;&amp;#039; kapselt die Erstellung von konkreten &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; einer {{AL|Interface|Schnittstelle}}, oder einer {{AL|Abstrakte_Klasse|Abstrakten Klasse}} und trennt sie vom restlichen Code. Die &amp;#039;&amp;#039;&amp;#039;Simple Factory&amp;#039;&amp;#039;&amp;#039; ist eigentlich kein &amp;#039;&amp;#039;&amp;#039;Entwurfsmuster&amp;#039;&amp;#039;&amp;#039;, sondern eher ein Programmieridiom (konkrete Programmieranweisung). Die entsprechenden &amp;#039;&amp;#039;&amp;#039;Design Patterns&amp;#039;&amp;#039;&amp;#039;, die auf der &amp;#039;&amp;#039;&amp;#039;Simple Factory&amp;#039;&amp;#039;&amp;#039; beruhen, sind das &amp;#039;&amp;#039;&amp;#039;Factory Method Pattern&amp;#039;&amp;#039;&amp;#039; und das &amp;#039;&amp;#039;&amp;#039;Abstract Factory Pattern&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Im Folgenden wird die &amp;#039;&amp;#039;&amp;#039;Simple Factory&amp;#039;&amp;#039;&amp;#039; anhand eines Beispiels erarbeitet:&amp;lt;br&amp;gt;&lt;br /&gt;
In einer Pizzeria werden Pizzas gemacht, diese werden &amp;#039;&amp;#039;&amp;#039;belegt&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;gebacken&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;geschnitten&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;eingepackt&amp;#039;&amp;#039;&amp;#039;. Dafür ist folgende {{AL|Klasse|Klasse}} gegeben:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Pizzeria {&lt;br /&gt;
  public Pizza bestellePizza(String typ) {&lt;br /&gt;
    Pizza pizza;&lt;br /&gt;
    if(typ.equals(&amp;quot;Salami&amp;quot;)) {&lt;br /&gt;
      pizza = new SalamiPizza();&lt;br /&gt;
    } else if(typ.equals(&amp;quot;Hawai&amp;quot;)) {&lt;br /&gt;
      pizza = new HawaiPizza();&lt;br /&gt;
    } else if(typ.equals(&amp;quot;Margherita&amp;quot;)) {&lt;br /&gt;
      pizza = new MargheritaPizza();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pizza.belegen();&lt;br /&gt;
    pizza.backen();&lt;br /&gt;
    pizza.schneiden();&lt;br /&gt;
    pizza.einpacken();&lt;br /&gt;
    return pizza;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Im obigen Code wird anhand des Pizza Typs, die konkrete {{AL|Klasse}} instanziert. {{JSL|Pizza}} kann entweder ein {{AL|Interface}} oder eine {{AL|Abstrakte_Klasse|Abstrakte Klasse}} sein, damit sie &amp;#039;&amp;#039;&amp;#039;nicht direkt instanziert&amp;#039;&amp;#039;&amp;#039; werden kann, da eine unkonkrete {{JSL|Pizza}} keinen Sinn macht. Die aktuelle Implementierung der Pizzeria hat leider eine Schwachstelle, wird eine neue Pizza hinzugefügt, so muss der Code geändert werden.&lt;br /&gt;
{{JML|start=&amp;#039;8&amp;#039;|highlight=&amp;#039;3-5&amp;#039;|code=&lt;br /&gt;
} else if(typ.equals(&amp;quot;Margherita&amp;quot;)) {&lt;br /&gt;
  pizza = new MargheritaPizza();&lt;br /&gt;
} else if(typ.equals(&amp;quot;Vegetariana&amp;quot;)) {&lt;br /&gt;
  pizza = new VegetarianaPizza();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pizza.belegen();&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
Nun verletzt das ganze folgendes &amp;#039;&amp;#039;&amp;#039;Design Prinzip&amp;#039;&amp;#039;&amp;#039; [[Design_Patterns#Offen_f.C3.BCr_Erweiterung_aber_geschlossen_f.C3.BCr_Ver.C3.A4nderung|Offen für Erweiterung aber geschlossen für Veränderung]]. Um dies zu beheben wird der Code der sich ändert, vom Code der sich nicht ändert getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kann sich ändern:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{JML|start=&amp;#039;4&amp;#039;|code=&lt;br /&gt;
if(typ.equals(&amp;quot;Salami&amp;quot;)) {&lt;br /&gt;
  pizza = new SalamiPizza();&lt;br /&gt;
} else if(typ.equals(&amp;quot;Hawai&amp;quot;)) {&lt;br /&gt;
  pizza = new HawaiPizza();&lt;br /&gt;
} else if(typ.equals(&amp;quot;Margherita&amp;quot;)) {&lt;br /&gt;
  pizza = new MargheritaPizza();&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ändert sich nicht, selbst wenn neue Pizzen hinzugefügt werden:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{JML|start=&amp;#039;12&amp;#039;|code=&lt;br /&gt;
pizza.belegen();&lt;br /&gt;
pizza.backen();&lt;br /&gt;
pizza.schneiden();&lt;br /&gt;
pizza.einpacken();&lt;br /&gt;
return pizza;&lt;br /&gt;
}}&lt;br /&gt;
Um den Code zu trennen, erstellen wir eine {{JSL|PizzaFabrik}} und verwenden dann in der {{JSL|Pizzeria}} diese &amp;#039;&amp;#039;&amp;#039;Fabrik&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class PizzaFactory {&lt;br /&gt;
  public Pizza createPizza(String typ) {&lt;br /&gt;
    Pizza pizza;&lt;br /&gt;
    if(typ.equals(&amp;quot;Salami&amp;quot;)) {&lt;br /&gt;
      pizza = new SalamiPizza();&lt;br /&gt;
    } else if(typ.equals(&amp;quot;Hawai&amp;quot;)) {&lt;br /&gt;
      pizza = new HawaiPizza();&lt;br /&gt;
    } else if(typ.equals(&amp;quot;Margherita&amp;quot;)) {&lt;br /&gt;
      pizza = new MargheritaPizza();&lt;br /&gt;
    }&lt;br /&gt;
    return pizza;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Pizzeria {&lt;br /&gt;
  private PizzaFabrik fabrik;&lt;br /&gt;
&lt;br /&gt;
  public Pizzeria(PizzaFabrik fabrik) {&lt;br /&gt;
    this.fabrik = fabrik;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public Pizza bestellePizza(String typ) {&lt;br /&gt;
    Pizza pizza = fabrik.createPizza(typ);&lt;br /&gt;
&lt;br /&gt;
    pizza.belegen();&lt;br /&gt;
    pizza.backen();&lt;br /&gt;
    pizza.schneiden();&lt;br /&gt;
    pizza.einpacken();&lt;br /&gt;
    return pizza;&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
 Somit ist der Code nun &amp;#039;&amp;#039;&amp;#039;geschlossen für Veränderung&amp;#039;&amp;#039;&amp;#039;, aber &amp;#039;&amp;#039;&amp;#039;offen für Erweiterung&amp;#039;&amp;#039;&amp;#039;. Kommt eine neue Pizza Sorte hinzu, so muss natürlich der Code in der {{JSL|PizzaFactory}} geändert werden, in der {{JSL|Pizzeria}} jedoch nicht mehr.&lt;br /&gt;
[[Datei:Simple factory.jpg|mini|none|600px|Simple Factory&amp;lt;ref name=&amp;#039;entwurfsmuster_von_kopf_bis_fuß&amp;#039;&amp;gt;Entwurfsmuster von Kopf bis Fuß&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Weiters sei angemerkt, das &amp;#039;&amp;#039;&amp;#039;Simple Factory&amp;#039;&amp;#039;&amp;#039; Pattern, findet man ganz oft in seiner Ausprägung als &amp;#039;&amp;#039;&amp;#039;Static Factory&amp;#039;&amp;#039;&amp;#039;. Das bedeutet, die {{AL|Methoden|Methode}} zur Erstellung der &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; ist &amp;#039;&amp;#039;&amp;#039;statisch&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static createPizza(String type) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Der Vorteil der daraus resultiert ist, es muss keine &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; der &amp;#039;&amp;#039;&amp;#039;Factory&amp;#039;&amp;#039;&amp;#039; erstellt werden. Der Nachteil ist, dass die &amp;#039;&amp;#039;&amp;#039;Factory Methode&amp;#039;&amp;#039;&amp;#039; nicht durch Vererbung geändert werden kann. Folgendes wäre ein Beispiel, wie durch {{AL|Vererbung}} eine weitere &amp;#039;&amp;#039;&amp;#039;Factory&amp;#039;&amp;#039;&amp;#039; erstellt wird:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class LockDownPizzaFactory extends PizzaFactory {&lt;br /&gt;
  public Pizza createPizza(String type) {&lt;br /&gt;
    //It&amp;#039;s Lockdown, only Margherita&lt;br /&gt;
    return new MargheritaPizza();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Oder ein weiteres super Beispiel durch Vererbung:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class FaschingPizzaFactory extends PizzaFactory {&lt;br /&gt;
  public Pizza createPizza(String type) {&lt;br /&gt;
    //In 50% der Fälle wird Margherita anstatt der gewünschten Pizza geliefert HAHAHA&lt;br /&gt;
    if(Math.random() &amp;gt; 0.5) {&lt;br /&gt;
      return new MargheritaPizza();&lt;br /&gt;
    } else {&lt;br /&gt;
      super.createPizza(type);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Singleton ==&lt;br /&gt;
 Das &amp;#039;&amp;#039;&amp;#039;Singleton Pattern&amp;#039;&amp;#039;&amp;#039; garantiert, dass von einer {{AL|Klasse}} nur eine &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; erstellt werden kann.&lt;br /&gt;
Warum kann dies wichtig sein? Oft sind verschiedene Programmteile von einer einzelnen &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; einer {{AL|Klasse}} abhängig. Beispiele hierfür wären:&lt;br /&gt;
* Caches&lt;br /&gt;
* API Schnittstellen Anbindung&lt;br /&gt;
* ImageLoader&lt;br /&gt;
* Einstellungsspeicher&lt;br /&gt;
* ...&lt;br /&gt;
Anhand eines &amp;#039;&amp;#039;&amp;#039;ImageLoaders&amp;#039;&amp;#039;&amp;#039; zum Anzeigen von Bildern aus dem Internet, soll das &amp;#039;&amp;#039;&amp;#039;Singleton Pattern&amp;#039;&amp;#039;&amp;#039; erläutert werden. Verschiedene Screens einer Anwendung laden Bilder und verwenden dazu die selbe {{AL|Klasse}}. Der &amp;#039;&amp;#039;&amp;#039;ImageLoader&amp;#039;&amp;#039;&amp;#039; selbst hat für die Bilder die übers Internet geladen zwei Arten von &amp;#039;&amp;#039;&amp;#039;Caches&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Memory Cache&amp;#039;&amp;#039;&amp;#039; - Bilder werden nach dem Laden im Arbeitsspeicher gespeichert&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Disk Cache&amp;#039;&amp;#039;&amp;#039; - Bilder werden nach dem Laden auf dem internen Speicher gespeichert&lt;br /&gt;
Jede &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; des &amp;#039;&amp;#039;&amp;#039;ImageLoaders&amp;#039;&amp;#039;&amp;#039; hat einen eigenen &amp;#039;&amp;#039;&amp;#039;Memory Cache&amp;#039;&amp;#039;&amp;#039;. Wenn nun von einer Applikation mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; des &amp;#039;&amp;#039;&amp;#039;ImageLoaders&amp;#039;&amp;#039;&amp;#039; verwendet werden, so führt dies dazu, dass die Bilder immer über den langsameren &amp;#039;&amp;#039;&amp;#039;Disk Cache&amp;#039;&amp;#039;&amp;#039; geladen werden müssen, was nicht erstrebenswert ist. Dies soll anhand folgender {{AL|Klasse}} veranschaulicht werden:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class ImageLoader {&lt;br /&gt;
  private Map&amp;lt;String, byte[]&amp;gt; imageCache = new HashMap&amp;lt;&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
  public byte[] getImage(String imageUrl) {&lt;br /&gt;
    if(imageCache.contains(imageUrl)) {&lt;br /&gt;
      return imageCache.get(imageUrl);&lt;br /&gt;
    } else {&lt;br /&gt;
      byte[] image = loadFromDisk(imageUrl);&lt;br /&gt;
      imageCache.put(imageUrl, image);&lt;br /&gt;
      return image;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  private byte[] loadFromDisk(imageUrl) {&lt;br /&gt;
     //Zuerst prüfen ob auf internem Speicher vorhanden, ansonsten übers Netzwerk abrufen&lt;br /&gt;
     ...&lt;br /&gt;
     return image;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Wenn nun jeder Teil des Programmes eine eigene &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; des {{JSL|ImageLoader}} verwendet, so existiert auch für jede &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; ein eigener &amp;#039;&amp;#039;&amp;#039;Memory Cache&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{{JML|start=2|code=&lt;br /&gt;
  private Map&amp;lt;String, byte[]&amp;gt; imageCache = new HashMap&amp;lt;&amp;gt;;&lt;br /&gt;
}}&lt;br /&gt;
Wie kann nun das Design der {{AL|Klasse}} {{JSL|ImageLoader}} verändert werden, dass immer die selbe &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; zurückgegeben wird?&amp;lt;br&amp;gt;&lt;br /&gt;
Dem {{JSL|ImageLoader}} wird ein {{AL|Klassenattribut}}, welches eine &amp;#039;&amp;#039;&amp;#039;Referenz&amp;#039;&amp;#039;&amp;#039; auf die einzige &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; von {{JSL|ImageLoader}} speichert, hinzugefügt. Weiters wird eine {{AL|Klassenmethode}} erstellt, welche die &amp;#039;&amp;#039;&amp;#039;Instanzierung&amp;#039;&amp;#039;&amp;#039; übernimmt.&lt;br /&gt;
{{JML|start=2|highlight=&amp;#039;3-10&amp;#039;|code=&lt;br /&gt;
private Map&amp;lt;String, byte[]&amp;gt; imageCache = new HashMap&amp;lt;&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
private static ImageLoader imageLoaderInstance;&lt;br /&gt;
&lt;br /&gt;
public static ImageLoader getInstance() {&lt;br /&gt;
  if(imageLoaderInstance == null) {&lt;br /&gt;
    imageLoaderInstance = new ImageLoader();&lt;br /&gt;
  }&lt;br /&gt;
  return imageLoaderInstance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public byte[] getImage(String imageUrl) {&lt;br /&gt;
}}&lt;br /&gt;
Nun besteht die Möglichkeit, aus jedem Bereich der Anwendung über {{JSL|ImageLoader.getInstance()}} die eine und wahre Instanz von {{JSL|ImageLoader}} zu erhalten. Jetzt gibt es leider noch ein kleines Problem, {{JSL|ImageLoader}} kann immer noch direkt über {{JSL|new ImageLoader();}} instanziert werden, was erneut zu unerwünschtem Verhalten führen kann. D.h. es besteht die Möglichkeit, dass der {{JSL|ImageLoader}} richtig verwendet wird, dazu wird man aber nicht gezwungen.&lt;br /&gt;
 Code sollte immer so entworfen werden, dass die korrekte Verwendung forciert wird.&lt;br /&gt;
Wie kann nun verhindert werden, dass außerhalb der {{AL|Klasse}} {{JSL|ImageLoader}} der {{AL|Konstruktor}} von {{JSL|ImageLoader}} aufgerufen wird? Sehr einfach, ein verändern der {{AL|Sichtbarkeit}} des {{AL|Konstruktor|Konstruktors}} führt zum gewünschten Ergebnis.&amp;lt;br&amp;gt;&lt;br /&gt;
Der {{JSL|ImageLoader}} besitzt aktuell den &amp;#039;&amp;#039;&amp;#039;default Konstruktor&amp;#039;&amp;#039;&amp;#039;, der nicht zwingend geschrieben werden muss:&lt;br /&gt;
{{JML|highlight=&amp;#039;2-3&amp;#039;|code=&lt;br /&gt;
public class ImageLoader {&lt;br /&gt;
  public ImageLoader() {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Nun wird die {{AL|Sichtbarkeit}} geändert:&lt;br /&gt;
{{JML|highlight=&amp;#039;2&amp;#039;|code=&lt;br /&gt;
public class ImageLoader {&lt;br /&gt;
  private ImageLoader() {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Somit ist nur noch eine &amp;#039;&amp;#039;&amp;#039;Instanzierung&amp;#039;&amp;#039;&amp;#039; über die {{AL|Klasse}} selbst möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
Der abgeschlossene &amp;#039;&amp;#039;&amp;#039;Singleton&amp;#039;&amp;#039;&amp;#039; sieht nun wie folgt aus:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class ImageLoader {&lt;br /&gt;
  private Map&amp;lt;String, byte[]&amp;gt; imageCache = new HashMap&amp;lt;&amp;gt;;&lt;br /&gt;
  private static ImageLoader imageLoaderInstance;&lt;br /&gt;
&lt;br /&gt;
  private ImageLoader() {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public static ImageLoader getInstance() {&lt;br /&gt;
    if(imageLoaderInstance == null) {&lt;br /&gt;
      imageLoaderInstance = new ImageLoader();&lt;br /&gt;
    }&lt;br /&gt;
    return imageLoaderInstance;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public byte[] getImage(String imageUrl) {&lt;br /&gt;
    if(imageCache.contains(imageUrl)) {&lt;br /&gt;
      return imageCache.get(imageUrl);&lt;br /&gt;
    } else {&lt;br /&gt;
      byte[] image = loadFromDisk(imageUrl);&lt;br /&gt;
      imageCache.put(imageUrl, image);&lt;br /&gt;
      return image;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  private byte[] loadFromDisk(imageUrl) {&lt;br /&gt;
     //Zuerst prüfen ob auf internem Speicher vorhanden, ansonsten übers Netzwerk abrufen&lt;br /&gt;
     ...&lt;br /&gt;
     return image;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
=== Multithreading ===&lt;br /&gt;
Wird nun der {{JSL|ImageLoader}} im Kontext von {{AL|Multithreading}} betrachtet, d.h. das Programm greift über verschiedene {{AL|Multithreading|Threads}} auf den {{JSL|ImageLoader}} zu, so ergibt sich ein Problem. Im folgenden ist der kritische Bereich des &amp;#039;&amp;#039;&amp;#039;Singleton&amp;#039;&amp;#039;&amp;#039; zu sehen:&lt;br /&gt;
{{JML|start=8|highlight=&amp;#039;2-3&amp;#039;|code=&lt;br /&gt;
  public static ImageLoader getInstance() {&lt;br /&gt;
    if(imageLoaderInstance == null) {&lt;br /&gt;
      imageLoaderInstance = new ImageLoader();&lt;br /&gt;
    }&lt;br /&gt;
    return imageLoaderInstance;&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
Wird von mehreren verschiedenen {{AL|Multithreading|Threads}} der Bereich in &amp;#039;&amp;#039;Zeile 10&amp;#039;&amp;#039; gleichzeitig betreten (solange noch keine &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; erstellt wurde), so können wieder mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; erstellt werden. Zwar wird nur die letzte &amp;#039;&amp;#039;&amp;#039;Instanz&amp;#039;&amp;#039;&amp;#039; gespeichert und auch bei erneutem Aufruf zurückgegeben, jedoch können mehrere &amp;#039;&amp;#039;&amp;#039;Instanzen&amp;#039;&amp;#039;&amp;#039; im Umlauf sein. Dieses Problem kann über {{AL|Synchronisierung}} gelöst werden:&lt;br /&gt;
{{JML|start=8|code=&lt;br /&gt;
  public static synchronized ImageLoader getInstance() {&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
Weiters sollte zusätzlich die {{AL|Methoden|Methode}} {{JSL|getImage(...)}} {{AL|Synchronisierung|synchronisiert}} werden. Wird das gleiche Bild aus unterschiedlichen {{AL|Multithreading|Threads}} geladen, so kann dies dazu führen, dass es zweimal geladen wird, was aber nicht nötig wäre:&lt;br /&gt;
{{JML|start=8|code=&lt;br /&gt;
  public synchronized byte[] getImage(String url) {&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
 Mit dem &amp;#039;&amp;#039;&amp;#039;Schlüsselwort&amp;#039;&amp;#039;&amp;#039; {{JSL|synchronized}} kommt immer ein &amp;#039;&amp;#039;&amp;#039;Performanceverlust&amp;#039;&amp;#039;&amp;#039; einher. Deswegen sollte genau abgewägt werden ob und wann es verwendet werden soll. In diesem Beispiel ist es vollkommen in Ordnung, da die Aufrufe der {{AL|Synchronisierung|synchronisierten}} {{AL|Methoden}} nicht 10000x pro Sekunde sein werden.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
</feed>