{"id":560,"date":"2023-02-24T18:01:36","date_gmt":"2023-02-24T17:01:36","guid":{"rendered":"https:\/\/rising-bits.com\/?p=560"},"modified":"2023-02-24T18:02:54","modified_gmt":"2023-02-24T17:02:54","slug":"singleton","status":"publish","type":"post","link":"https:\/\/rising-bits.com\/en\/singleton\/","title":{"rendered":"Singleton &#038; Factory"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Das Singleton-Muster ist ein Entwurfsmuster, das dazu dient, sicherzustellen, dass eine Klasse nur eine einzige Instanz hat und der Zugriff auf diese Instanz global erfolgt. Es ist besonders n\u00fctzlich, wenn Sie sicherstellen m\u00f6chten, dass eine bestimmte Klasse nur einmal in einer Anwendung erstellt wird, und dann von \u00fcberall aus darauf zugegriffen werden kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Singleton kann auf verschiedene Weise implementiert werden, aber im Wesentlichen besteht es aus einer Klasse mit einer privaten Konstruktorfunktion und einer statischen Eigenschaft, die die einzige Instanz der Klasse speichert. Der Zugriff auf die Instanz erfolgt \u00fcber eine statische Methode der Klasse, die sicherstellt, dass immer nur eine Instanz erstellt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Singleton-Muster hat mehrere Vorteile:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es stellt sicher, dass eine Klasse nur einmal erstellt wird, was Speicherplatz spart und m\u00f6gliche Fehler vermeidet, die durch das Erstellen mehrerer Instanzen der gleichen Klasse entstehen k\u00f6nnen.<\/li>\n\n\n\n<li>Es erleichtert die Verwaltung von globalen Ressourcen (z.B. einer Datenbankverbindung), die von verschiedenen Teilen einer Anwendung verwendet werden.<\/li>\n\n\n\n<li>Es erleichtert die Implementierung von Frameworks und Bibliotheken, indem es sicherstellt, dass bestimmte Klassen nur einmal erstellt werden und dann von verschiedenen Teilen der Anwendung verwendet werden k\u00f6nnen.<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie eine Anwendung haben, die h\u00e4ufig auf eine Datenbank zugreift, kann das Erstellen einer Verbindung zur Datenbank jedes Mal, wenn Sie auf die Datenbank zugreifen m\u00fcssen, eine erhebliche Belastung f\u00fcr die Ressourcen Ihrer Anwendung darstellen. Durch die Verwendung des Singleton-Musters k\u00f6nnen Sie sicherstellen, dass nur eine Verbindung erstellt wird und von verschiedenen Teilen Ihrer Anwendung verwendet werden kann.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Beispiel<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"typescript\" class=\"language-typescript\">class MySingleton {\n  private static instance: MySingleton;\n\n  private constructor() {}\n\n  public static getInstance(): MySingleton {\n    if (!MySingleton.instance) {\n      MySingleton.instance = new MySingleton();\n    }\n\n    return MySingleton.instance;\n  }\n\n  public doSomething(): void {\n    console.log(\"Singleton instance is doing something.\");\n  }\n}\n\nconst mySingleton = MySingleton.getInstance();\nmySingleton.doSomething();\n\n\/\/ Output: Singleton instance is doing something.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel haben wir eine Klasse <code>MySingleton<\/code> definiert, die einen privaten Konstruktor hat und eine statische Eigenschaft <code>instance<\/code>, die die einzige Instanz der Klasse speichert. Die statische Methode <code>getInstance<\/code> stellt sicher, dass nur eine Instanz erstellt wird, indem sie \u00fcberpr\u00fcft, ob <code>instance<\/code> bereits initialisiert wurde, bevor sie eine neue Instanz erstellt. Schlie\u00dflich haben wir eine Methode <code>doSomething<\/code>, die von der Singleton-Instanz aufgerufen werden kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um auf die Singleton-Instanz zuzugreifen, rufen wir einfach <code>MySingleton.getInstance()<\/code> auf. Wenn es bereits eine Instanz gibt, wird diese zur\u00fcckgegeben. Andernfalls wird eine neue Instanz erstellt und zur\u00fcckgegeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Anwendungsfall: Datenbankverbindung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wir isolieren unser Singleton, welches die Datenbankverbindung bereith\u00e4lt, mittels eines weiteren Musters: <code>Factory<\/code>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Factory-Methode ist ein Entwurfsmuster, das dazu dient, die Erstellung von Objekten zu kapseln und zu isolieren. Es erm\u00f6glicht die Flexibilit\u00e4t, die Art und Weise zu \u00e4ndern, wie ein Objekt erstellt wird, ohne den Code zu \u00e4ndern, der das Objekt verwendet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Bezug auf das Singleton-Muster k\u00f6nnte die Factory-Methode verwendet werden, um die Erstellung der Singleton-Instanz in einer separaten Klasse zu kapseln und zu isolieren. Auf diese Weise wird sichergestellt, dass nur die Factory-Klasse die Singleton-Instanz erstellt und dass sie nicht von anderen Teilen der Anwendung direkt erstellt werden kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die Verwendung der Factory-Methode k\u00f6nnen auch weitere Vorteile erzielt werden, wie beispielsweise eine bessere Testbarkeit des Codes, da es einfacher ist, Mock-Objekte f\u00fcr die Factory-Klasse zu erstellen und zu verwenden, um die Singleton-Instanz zu simulieren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"typescript\" class=\"language-typescript\">class DatabaseConnection {\n  private static instance: DatabaseConnection;\n  private constructor() {\n    \/\/ Set up database connection\n  }\n\n  static getInstance(): DatabaseConnection {\n    if (!DatabaseConnection.instance) {\n      DatabaseConnection.instance = new DatabaseConnection();\n    }\n    return DatabaseConnection.instance;\n  }\n\n  \/\/ Database operations\n  \/\/ ...\n\n}\n\nclass DatabaseConnectionFactory {\n  static createConnection(): DatabaseConnection {\n    return DatabaseConnection.getInstance();\n  }\n}\n\n\/\/ Usage:\nconst dbConnection = DatabaseConnectionFactory.createConnection();\n\/\/ Use dbConnection for database operations<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel erstellen wir eine Klasse namens <code>DatabaseConnection<\/code>, die eine Datenbankverbindung darstellt. Die <code>getInstance()<\/code>-Methode der Klasse stellt sicher, dass nur eine einzige Instanz der <code>DatabaseConnection<\/code>-Klasse erstellt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>DatabaseConnectionFactory<\/code>-Klasse wird verwendet, um eine Verbindung zur Datenbank zu erstellen. Sie kapselt die Erstellung der <code>DatabaseConnection<\/code>-Instanz, so dass nur die Factory-Klasse die Instanz erstellen kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die Verwendung der Factory-Methode k\u00f6nnen wir sicherstellen, dass die Erstellung der <code>DatabaseConnection<\/code>-Instanz gekapselt ist und von anderen Teilen der Anwendung nicht direkt aufgerufen werden kann. Au\u00dferdem k\u00f6nnen wir bei Bedarf eine andere Factory-Klasse erstellen, um eine andere Art von Verbindung zur Datenbank zu erstellen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um einen Mock der Datenbankverbindung zu erstellen, k\u00f6nnen Sie eine neue Klasse erstellen, die das gleiche Interface wie die <code>DatabaseConnection<\/code>-Klasse hat, aber eine andere Implementierung verwendet, die keine tats\u00e4chliche Verbindung zur Datenbank herstellt. Hier ist ein Beispielcode:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"typescript\" class=\"language-typescript\">interface IDatabaseConnection {\n  \/\/ Database operations\n  \/\/ ...\n}\n\nclass DatabaseConnection implements IDatabaseConnection {\n  private static instance: DatabaseConnection;\n  private constructor() {\n    \/\/ Set up database connection\n  }\n\n  static getInstance(): IDatabaseConnection {\n    if (!DatabaseConnection.instance) {\n      DatabaseConnection.instance = new DatabaseConnection();\n    }\n    return DatabaseConnection.instance;\n  }\n\n  \/\/ Database operations\n  \/\/ ...\n\n}\n\nclass MockDatabaseConnection implements IDatabaseConnection {\n  \/\/ Mock implementation for database operations\n  \/\/ ...\n\n}\n\nclass DatabaseConnectionFactory {\n  static createConnection(): IDatabaseConnection {\n    if (process.env.NODE_ENV === 'test') {\n      return new MockDatabaseConnection();\n    }\n    return DatabaseConnection.getInstance();\n  }\n}\n\n\/\/ Usage:\nconst dbConnection = DatabaseConnectionFactory.createConnection();\n\/\/ Use dbConnection for database operations<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel haben wir eine neue Schnittstelle namens <code>IDatabaseConnection<\/code> definiert, die die Methoden definiert, die von der Datenbankverbindung verwendet werden. Die <code>DatabaseConnection<\/code>-Klasse implementiert diese Schnittstelle und stellt die tats\u00e4chliche Verbindung zur Datenbank her.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>MockDatabaseConnection<\/code>-Klasse implementiert ebenfalls die <code>IDatabaseConnection<\/code>-Schnittstelle, verwendet jedoch eine Mock-Implementierung f\u00fcr die Methoden, die keine tats\u00e4chliche Verbindung zur Datenbank herstellen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In der <code>DatabaseConnectionFactory<\/code>-Klasse haben wir eine Bedingung hinzugef\u00fcgt, die pr\u00fcft, ob sich die Anwendung im Testmodus befindet. Wenn dies der Fall ist, wird eine <code>MockDatabaseConnection<\/code>-Instanz erstellt, andernfalls wird die <code>DatabaseConnection<\/code>-Instanz erstellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die Verwendung von <code>process.env.NODE_ENV<\/code> k\u00f6nnen wir die Umgebung der Anwendung bestimmen. Wenn der Testmodus aktiviert ist, k\u00f6nnen wir eine Mock-Implementierung verwenden, um Tests auszuf\u00fchren, ohne tats\u00e4chlich auf die Datenbank zugreifen zu m\u00fcssen.<\/p>","protected":false},"excerpt":{"rendered":"<p>Das Singleton-Muster ist ein Entwurfsmuster, das dazu dient, sicherzustellen, dass eine Klasse nur eine einzige Instanz hat und der Zugriff [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":561,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[94],"tags":[97,111,108,110,76],"class_list":["post-560","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-patterns","tag-clean-code","tag-patterns","tag-singleton","tag-tests","tag-typescript"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/mlmwwmq2k3up.i.optimole.com\/w:auto\/h:auto\/q:mauto\/f:best\/https:\/\/i0.wp.com\/rising-bits.com\/wp-content\/uploads\/2023\/02\/7cc08v.jpg?fit=577%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/posts\/560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/comments?post=560"}],"version-history":[{"count":2,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/posts\/560\/revisions"}],"predecessor-version":[{"id":563,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/posts\/560\/revisions\/563"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/media\/561"}],"wp:attachment":[{"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/media?parent=560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/categories?post=560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rising-bits.com\/en\/wp-json\/wp\/v2\/tags?post=560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}