Jump to content
Unity Insider Forum

Singleton - The Easy Way!


suckerpunch

Recommended Posts

Hallo Liebe Forengemeinde,

 

die Fortgeschrittenen unter uns kennen sicherlich das Singleton-Pattern, dies muss oft händisch für jede Klasse neu implementiert werden, was es gerade Anfängern schwer macht es immer umzusetzen.

 

Ich mach es kurz, diese Klasse soll es jeden erleichtern das Pattern umsetzen und allein durch das erweitern dieser Klasse ein Singleton zu haben :)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Util
{
/// <summary>
/// Lazy-loading singleton
/// </summary>
/// <typeparam name="T">The type to have the singleton instance of</typeparam>
[serializable]
public abstract class Singleton<T> where T : new()
{
	/// <summary>
	/// Private constructor to avoid external instantiation.
	/// </summary>
	/// <remarks>
	/// This is present to keep the compiler from providing a default public constructor
	/// </remarks>
	protected Singleton()
	{

	}

	/// <summary>
	/// Return an instance of
	/// </summary>
	public static T Instance
	{
		get { return SingletonHolder.instance; }
		set { SingletonHolder.instance = value; }
	}

	/// <summary>
	/// Sealed class to avoid any heritage from this helper class
	/// </summary>
	private sealed class SingletonHolder
	{
		internal static T instance = new T();

		/// <summary>
		/// Explicit static constructor to tell C# compiler not to mark type as beforefieldinit
		/// </summary>
		static SingletonHolder()
		{
		}
	}
}
}

 

Es ist Hauptsächlich für die typischen Klassen gedacht die nur einmal vorkommen sollen, NetworkService, DataLoader, verschiedene Engines

 

Benutzung wäre dann einfach

public class MySQL : Singleton<MySQL>
{
}

 

Und schon wäre die Klasse MySQL ein Singleton und kann nur einmal erzeugt werden.

 

Mit freundlichen Grüßen

 

suckerpunch

 

PS: Die Klasse stammt aus einem sehr sehr großen Projekt und ist eigentlich hinreichend erprobt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmmh, ich muss mal kurz trollen - Sorry :) Also in einem kleinen Projekt nutze ich gerne Singletons und ignoriere die ganze Kritik von wegen Anti-Pattern und so (s. [1][2][3][4][5][6]). Aber in einem sehr, sehr großen Projekt würde ich es anders designen, weil es echte Probleme geben kann. Vor allem die Reihenfolge der Initialisierung - muss nicht aber - kann zu Fehlern führen, die nur schwer zu fixen sind. Mock-Objekt-Instanziierung für Test-Fälle u.ä. wird auch eher komplexer. Da tendiere ich in diesem Fall (großes Projekt) eher zu einer zentralen Klasse, die die Instanzen kreiert und verwaltet.

 

Ich würde auch für ein Singleton ungern den einen Schuss opfern, den man bei der Vererbung hat. Irgendwie kommt mir das nicht natürlich vor, dies als Is-A-relationship zu designen. Wenn ich z.B. von MonoBehaviour abgeleitete Objekte mit DontDestroyOnLoad habe, so sind diese meistens auch Singleton-artig unterwegs. In diesem Fall kann ich kein ": Singleton<MyClass>" angeben und somit habe ich doch 2 verschiedene Wege, mit Singletons zu arbeiten.

 

Aber: Man kann das so sehen und beim Software-Design gibt es kein Richtig und Falsch (manchmal ist da sogar das sogenannte Richtige falsch oder das vermeintlich Falsche richtig ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man muss Singleton's natürlich auch dort anwenden wo sie Sinn machen wenn hinter der Klasse eine Vererbungsstruktur steht dann sollte man eh meistens die Finger davon lassen weil das zu ganz anderen Problemen führt. Das was du ansprichst Zentrale Klasse die Instanzen verwaltet und erzeugt ist doch eher das Factory-Pattern.

 

Würde mich bei Singleton's wirklich auf Engines, Loaders, DAOs beschränken

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich finde (naja, "Pseudo"-)Singeltons in Unity interessant, wenn man was im Update-Zyklus braucht, aber eben keinen Nutzen von mehreren Instanzen hat.

Ich finde den Code ganz cool, auch wenn ich nichts damit anfangen kann. Das nächste Mal, wenn ich eins brauche, schaue ich mal, ob ich was daraus mopsen und in ein MonoBehaviour und in Awake integrieren kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...