{"id":947,"date":"2016-04-14T16:30:00","date_gmt":"2016-04-14T14:30:00","guid":{"rendered":"http:\/\/invidit.de\/blog\/?p=947"},"modified":"2016-04-14T16:47:13","modified_gmt":"2016-04-14T14:47:13","slug":"von-doppelgaengern-und-handwerkern","status":"publish","type":"post","link":"https:\/\/invidit.de\/blog\/von-doppelgaengern-und-handwerkern\/","title":{"rendered":"Von Doppelg\u00e4ngern und Handwerkern"},"content":{"rendered":"<p>Hallo Spa\u00df-Coder.<\/p>\n<p>In unserem letzten Artikel zur Serie \u00fcber Entwurfsmuster haben wir uns mit dem <a href=\"http:\/\/invidit.de\/blog\/einzigartiges-einzelstueck-der-vereinzelung\/\" target=\"_blank\">Einzelst\u00fcck (<em>singleton)<\/em> <\/a>besch\u00e4ftigt. Es gibt aber noch weitere sog. Erzeugungsmuster. Mit diesen werden wir uns im Rahmen dieses Artikels besch\u00e4ftigen.<\/p>\n<p>Die verbleibenden Erzeugungsmuster aus der Sammlung der Gang of Four sind:<\/p>\n<ul>\n<li>Prototyp <i>(<span lang=\"en\" xml:lang=\"en\">prototype<\/span>)<\/i><\/li>\n<li>Erbauer <i>(<span lang=\"en\" xml:lang=\"en\">builder<\/span>)<\/i><\/li>\n<\/ul>\n<p>Auch diese beiden Muster dienen dazu, ein Objekt zu erstellen, mit dem wir dann weiterarbeiten k\u00f6nnen. Aber warum wollen wir das? Hier gelten die gleichen Gr\u00fcnde, die wir auch schon bei der <a href=\"http:\/\/invidit.de\/blog\/maschinelle-erzeugnisse\/\" target=\"_blank\">Abstrakten Fabrik <\/a>angef\u00fchrt haben. Wir wollen m\u00f6glichst auf <span style=\"color: #800080;\">new<\/span> verzichten, wenn wir uns in Teilen des Codes bewegen, die sich mit hoher Wahrscheinlichkeit \u00e4ndern werden.<\/p>\n<p>Der <strong>Prototype<\/strong> verh\u00e4lt sich genau anders herum als ein Singleton. Immer dann, wenn wir uns ein Objekt des Prototypen holen, ist dies eine neue Instanz. Allerdings ist diese Instanz nicht immer ganz neu, sondern wird als Kopie einer Vorlage erstellt. Anschlie\u00dfend kann der Prototyp dann an die aktuellen Bed\u00fcrfnisse angepasst werden.<\/p>\n<p>Der <strong>Builder<\/strong> erzeugt ein komplexes Objekt, indem er es aus einzelnen Bestandteilen zusammensetzt. Dieses Muster dient entweder der Wiederverwendung, wenn das Objekt aus verschiedenen Quellsystemen heraus erstellt werden soll oder es dient schlicht der Vereinfachung der Objekterstellung. Beim ersten Anwendungsfall m\u00f6chten wir wieder die Aspekte der Erstellung und der Repr\u00e4sentation voneinander trennen (<a href=\"http:\/\/invidit.de\/blog\/aus-prinzip-nur-eine-verantwortlichkeit\/\" target=\"_blank\">Separation of Conerns<\/a>), beim zweiten geht es eher um besser lesbaren Code.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wann sind diese Entwurfsmuster sinnvoll anzuwenden?<\/h1>\n<h2>Prototype<\/h2>\n<p>Der Prototype hilft uns insbesondere dann, wenn die Erzeugung von Instanzen einer Klasse aufwendig oder kompliziert ist und die erstellten Objekte einander sehr \u00e4hnlich sind.<\/p>\n<p>Am besten vergleichen l\u00e4sst sich das Muster mit der Erstellung von Dokumenten. Damit ich m\u00f6glichst schnell mit dem Erfassen des Inhalts starten kann, erstelle ich mein neues Dokument in der Regel nicht leer, sondern aus einer Vorlage, einem sog. Template.<\/p>\n<p>Der Kern des Musters ist, dass ich aus einer Vorlage eine Kopie erstellen kann, die ich im Folgenden dann weiterverwende. Die Erstellung der Kopie hat das Ziel, eben nicht teuer, sondern m\u00f6glichst schlank zu sein.<\/p>\n<p>&nbsp;<\/p>\n<h3>Beispiel<\/h3>\n<p>Nehmen wir einmal, wir m\u00f6chten Gespr\u00e4che dokumentieren. Dazu haben wir ein Formular auf einer Webseite, in das wir f\u00fcr die verschiedenen Gespr\u00e4chspunkte Eintr\u00e4ge machen k\u00f6nnen. Zus\u00e4tzlich gibt es in dem Gespr\u00e4chsprotokoll spezielle Eingaben, wie etwa das Datum, die Liste der Beteiligten und zum Schluss die M\u00f6glichkeit, Feedback in Form einer Bewertung abzugeben.<\/p>\n<p>Von dieser Art der Gespr\u00e4chsprotokolle gibt es die verschiedensten Variationen:<\/p>\n<ul>\n<li>Mitarbeitergespr\u00e4ch zwischen Mitarbeiter und der F\u00fchrungskraft<\/li>\n<li>Interview f\u00fcr eine Marketingkampagne<\/li>\n<li>Fragebogen zur Mitarbeiterzufriedenheit<\/li>\n<li>Interview mit dem Stakeholder f\u00fcr die agile Umsetzung einer User-Story<\/li>\n<\/ul>\n<p>Jedes dieser Formulare l\u00e4sst sich nur sehr aufwendig erstellen. Hier m\u00fcssen die Definitionen aus der Datenbank gelesen werden, bestimmte Steuerelemente initialisiert werden, Reihenfolgen festgelegt werden, &#8230;<\/p>\n<pre class=\"lang:java decode:true\" title=\"Klasse: ConversationPrototype\">public abstract class ConversationPrototype implements Conversation {\r\n    public String title;\r\n    public List&lt;ConversationItem&gt; conversationItems;\r\n\r\n    public abstract ConversationPrototype clone();\r\n\r\n    [...]\r\n}<\/pre>\n<pre class=\"lang:java decode:true\" title=\"Klasse: ConversationInterview\">public class ConversationInterview extends ConversationPrototype {\r\n\r\n    @Override\r\n    public ConversationInterview clone() {\r\n        ConversationInterview conversation = new ConversationInterview();\r\n        conversation.title = this.title;\r\n        conversation.conversationItems = this.conversationItems\r\n                .stream()\r\n                .map(item -&gt; new ConversationItem(item))\r\n                .collect(Collectors.toList());\r\n\r\n        return conversation;\r\n    }\r\n}<\/pre>\n<pre class=\"lang:java decode:true\" title=\"Klasse: ConversationItem\">public class ConversationItem {\r\n\r\n    public String name;\r\n\r\n    \/\/ Imagine a very complicated class that can only be created with lots of effort...\r\n\r\n    public ConversationItem(String name) {\r\n        this.name = name;\r\n    }\r\n\r\n    \/\/ Copy Constructor\r\n    public ConversationItem(ConversationItem item) {\r\n        this.name = item.name;\r\n        \/\/ more copy code goes here\r\n    }\r\n   [...]\r\n}<\/pre>\n<p>Damit dies nicht jedes Mal aufs neue manuell durch den Client gemacht werden muss, ist es \u00fcber das Prototype-Muster m\u00f6glich, die Erzeugung in einer Klasse zu kapseln (etwa in eine Factory) und nur einmalig durchzuf\u00fchren. Sobald das Formular ein zweites Mal f\u00fcr ein anderes Gespr\u00e4ch verwendet werden soll, wird das Template einfach dupliziert und an den Client zur\u00fcckgegeben.<\/p>\n<p>Im Beispiel nutzen wir f\u00fcr die Bestandteile des Gespr\u00e4chs die Praxis des <a href=\"https:\/\/de.wikipedia.org\/wiki\/Kopierkonstruktor\" target=\"_blank\">Copy-Constructors<\/a>. Dabei wird dem Konstruktor eine Instanz vom gleichen Typ wie der Klasse in der wir uns befinden \u00fcbergeben. Die einzelnen Werte werden dann einfach den Klassenvariablen zugewiesen.<\/p>\n<p>&nbsp;<\/p>\n<h3>Hinweis<\/h3>\n<p>Auch der Prototype l\u00e4sst sich durch Frameworks &#8211; wie etwa Spring &#8211; unterst\u00fctzt umsetzen. Dies deckt zwar nicht alle Anwendungsf\u00e4lle ab, sollte aber immer, wenn m\u00f6glich genutzt werden.<\/p>\n<p>&nbsp;<\/p>\n<h3>Vermischung von Mustern<\/h3>\n<p>Denkbar ist es, dass wir Muster miteinander kombinieren. Wenn es z.B. eine Familie von Produkten gibt, die alle recht \u00e4hnlich sind, aber in der Erstellung recht teuer, kann man dar\u00fcber nachdenken, eine <a href=\"http:\/\/invidit.de\/blog\/maschinelle-erzeugnisse\/\" target=\"_blank\">Abstrakte Fabrik <\/a>zu erstellen, dessen Produkte Prototypen sind. Auch die Verwendung im Zusammenspiel mit einem teuer zu erstellenden <a href=\"http:\/\/invidit.de\/blog\/einzigartiges-einzelstueck-der-vereinzelung\/\" target=\"_blank\">Singleton<\/a> ist denkbar.<\/p>\n<p>&nbsp;<\/p>\n<h2>Builder<\/h2>\n<p>Das Muster des Builders verwenden wir immer dann, wenn die Erstellung eines komplexen Objekts unabh\u00e4ngig von der Erzeugung der Bestandteile sein soll. Wenn es also keine Rolle spielt, in welcher Reihenfolge die Bestandteile des Objekts erzeugt werden.<\/p>\n<p>Eine zweite M\u00f6glichkeit, den Builder einzusetzen ist, wenn die Erstellung eines Objekts einen internen Zustand erfordert, der dem Ersteller aber nicht bekannt ist oder bekannt sein soll.<\/p>\n<h3>Beispiel<\/h3>\n<p>Es gibt verschiedene M\u00f6glichkeiten, einen Builder zu implementieren und die Instanz hinterher abzurufen. Typisch ist etwa eine statische, interne Klasse <em>Builder<\/em> innerhalb des Objekts, welches erstellt werden soll. Dies sieht dann wie folgt aus:<\/p>\n<pre class=\"lang:java decode:true \">public class Person {\r\n    private String name;\r\n    private String surname;\r\n\r\n    Person(Builder builder) {\r\n        this.name = builder.name;\r\n        this.surname = builder.surname;\r\n    }\r\n\r\n    public String getName() {\r\n        return name;\r\n    }\r\n\r\n    public String getSurname() {\r\n        return surname;\r\n    }\r\n\r\n    public static class Builder {\r\n        private String name;\r\n        private String surname;\r\n\r\n        public Builder withName(String name) {\r\n            this.name = name;\r\n            return this;\r\n        }\r\n\r\n        public Builder withSurname(String surname) {\r\n            this.surname = surname;\r\n            return this;\r\n        }\r\n\r\n        public Person build() {\r\n            return new Person(this);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Hier wird der Builder also dem Konstruktor des zu erstellenden Objekts \u00fcbergeben. Dies hat den Vorteil, dass das Objekt auch mit anderen Buildern erstellt werden kann, etwa zu Testzwecken.<\/p>\n<p>Eine andere M\u00f6glichkeit kann auch sein, dass der Builder selbst das Objekt erstellt und dann zur\u00fcck gibt. Welche Art gew\u00e4hlt wird h\u00e4ngt im Grunde vom Objekt ab und sollte je nach Situation gew\u00e4hlt werden.<\/p>\n<p>Als sinnvoll hat sich herausgestellt, dass der Builder in Form eines <a href=\"https:\/\/de.wikipedia.org\/wiki\/Fluent_Interface\" target=\"_blank\">Fluent Interface<\/a> implementiert wird. Dies vereinfacht den Aufruf und macht den Code zur Erstellung deutlich besser lesbar.<\/p>\n<p>&nbsp;<\/p>\n<h1>Zusammenfassung<\/h1>\n<p>Die in diesem Artikel vorgestellten Muster runden die Liste der Erzeugungsmuster aus der Sammlung der Gang of Four ab. Sie dienen zur\u00a0 Erstellung von Objekten in besonderen, immer wiederkehrenden Situationen.<\/p>\n<p>Wir hoffen, dass die Beispiele euch gen\u00fcgend Anhaltspunkte daf\u00fcr gegeben haben, wann eines der Muster sinnvoll eingesetzt werden kann.<\/p>\n<p>&nbsp;<\/p>\n<p>Viel Spa\u00df beim Ausprobieren<\/p>\n<p>Eure Spa\u00df-Coder<\/p>\n<p>&nbsp;<\/p>\n<p>Den Code zu unseren Beispielen k\u00f6nnt ihr auf Github finden:<\/p>\n<ul>\n<li>https:\/\/github.com\/invidit\/CodeQuality\/tree\/master\/DesignPattern\/Prototype<\/li>\n<li>https:\/\/github.com\/invidit\/CodeQuality\/tree\/master\/DesignPattern\/Builder<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Dieser Artikel basiert neben unseren Erfahrungen auf den Ausf\u00fchrungen aus:<\/p>\n<ul>\n<li><a href=\"https:\/\/de.wikipedia.org\/wiki\/\" target=\"_blank\">https:\/\/de.wikipedia.org\/wiki\/<\/a>\n<ul>\n<li><a title=\"Prototyp (Entwurfsmuster)\" href=\"https:\/\/de.wikipedia.org\/wiki\/Prototyp_%28Entwurfsmuster%29\" target=\"_blank\">Prototyp<\/a> <i>(<span lang=\"en\" xml:lang=\"en\">prototype<\/span>)<\/i><\/li>\n<li><a title=\"Erbauer (Entwurfsmuster)\" href=\"https:\/\/de.wikipedia.org\/wiki\/Erbauer_%28Entwurfsmuster%29\" target=\"_blank\">Erbauer<\/a> <i>(<span lang=\"en\" xml:lang=\"en\">builder<\/span>)<\/i><\/li>\n<\/ul>\n<\/li>\n<li>Freeman, Eric &amp; Freeman, Elisabeth &#8211; Entwurfsmuster von Kopf bis Fu\u00df &#8211; O&#8217;Reilly, 2006.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hallo Spa\u00df-Coder. In unserem letzten Artikel zur Serie \u00fcber Entwurfsmuster haben wir uns mit dem Einzelst\u00fcck (singleton) besch\u00e4ftigt. Es gibt aber noch weitere sog. Erzeugungsmuster. Mit diesen werden wir uns im Rahmen dieses Artikels besch\u00e4ftigen. Die verbleibenden Erzeugungsmuster aus der Sammlung der Gang of Four sind: Prototyp (prototype) Erbauer (builder) Auch diese beiden Muster dienen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[90],"tags":[134,130,133],"_links":{"self":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/947"}],"collection":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/comments?post=947"}],"version-history":[{"count":16,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/947\/revisions"}],"predecessor-version":[{"id":1047,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/947\/revisions\/1047"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media\/971"}],"wp:attachment":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media?parent=947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/categories?post=947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/tags?post=947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}