diff --git a/Assets/Creational Patterns/Singleton Pattern/Example1/SingletonPatternExample1.cs b/Assets/Creational Patterns/Singleton Pattern/Example1/SingletonPatternExample1.cs index a0639a8..d1dbcbd 100644 --- a/Assets/Creational Patterns/Singleton Pattern/Example1/SingletonPatternExample1.cs +++ b/Assets/Creational Patterns/Singleton Pattern/Example1/SingletonPatternExample1.cs @@ -16,19 +16,8 @@ public class SingletonPatternExample1 : MonoBehaviour { void Start() { - LoadBalancer b1 = LoadBalancer.GetLoadBalancer(); - LoadBalancer b2 = LoadBalancer.GetLoadBalancer(); - LoadBalancer b3 = LoadBalancer.GetLoadBalancer(); - LoadBalancer b4 = LoadBalancer.GetLoadBalancer(); + var balancer = LoadBalancer.Instance; - // Same instance? - if (b1 == b2 && b2 == b3 && b3 == b4) - { - Debug.Log("Same instance\n"); - } - - // Load balance 15 server requests - LoadBalancer balancer = LoadBalancer.GetLoadBalancer(); for (int i = 0; i < 15; i++) { string server = balancer.Server; @@ -37,56 +26,39 @@ void Start() } } - /// - /// The 'Singleton' class - /// - class LoadBalancer + public sealed class LoadBalancer { + private static readonly object _syncLock = new object(); private static LoadBalancer _instance; - private List _servers = new List(); - private System.Random _random = new System.Random(); - - // Lock synchronization object - private static object syncLock = new object(); + private readonly List _servers = new List { "ServerI", "ServerII", "ServerIII", "ServerIV", "ServerV" }; + private readonly System.Random _random = new System.Random(); - // Constructor (protected) - protected LoadBalancer() - { - // List of available servers - _servers.Add("ServerI"); - _servers.Add("ServerII"); - _servers.Add("ServerIII"); - _servers.Add("ServerIV"); - _servers.Add("ServerV"); - } + private LoadBalancer() { } - public static LoadBalancer GetLoadBalancer() + public static LoadBalancer Instance { - // Support multithreaded applications through - // 'Double checked locking' pattern which (once - // the instance exists) avoids locking each - // time the method is invoked - if (_instance == null) + get { - lock (syncLock) + if (_instance == null) { - if (_instance == null) + lock (_syncLock) { - _instance = new LoadBalancer(); + if (_instance == null) + { + _instance = new LoadBalancer(); + } } } + return _instance; } - - return _instance; } - // Simple, but effective random load balancer public string Server { get { int r = _random.Next(_servers.Count); - return _servers[r].ToString(); + return _servers[r]; } } } diff --git a/Assets/Creational Patterns/Singleton Pattern/Example2/SingletonPatternExample2.cs b/Assets/Creational Patterns/Singleton Pattern/Example2/SingletonPatternExample2.cs index 7c3204f..e147bf9 100644 --- a/Assets/Creational Patterns/Singleton Pattern/Example2/SingletonPatternExample2.cs +++ b/Assets/Creational Patterns/Singleton Pattern/Example2/SingletonPatternExample2.cs @@ -23,35 +23,27 @@ void Update() } } - - /// - /// 某单例manager - /// - public class RenderManager + public sealed class RenderManager { - private static RenderManager instance; + private static RenderManager _instance; + + private RenderManager() { } + public static RenderManager Instance { get { - if (instance == null) + if (_instance == null) { - instance = new RenderManager(); + _instance = new RenderManager(); } - return instance; + return _instance; } } - /// - /// 随便某方法 - /// public void Show() { - Debug.Log("RenderManager is a Singleton !"); + Debug.Log("RenderManager is a Singleton!"); } } - - - - } \ No newline at end of file diff --git a/Assets/Creational Patterns/Singleton Pattern/Example3/SingletonPatternExample3.cs b/Assets/Creational Patterns/Singleton Pattern/Example3/SingletonPatternExample3.cs index 7774d02..bada85a 100644 --- a/Assets/Creational Patterns/Singleton Pattern/Example3/SingletonPatternExample3.cs +++ b/Assets/Creational Patterns/Singleton Pattern/Example3/SingletonPatternExample3.cs @@ -7,28 +7,19 @@ namespace SingletonPatternExample3 { - public class SingletonPatternExample3 : MonoBehaviour { void Start() { - //单例A SingletonA.Instance.DoSomething(); - - //单例B SingletonB.Instance.DoSomething(); } - } - /// - /// 单例类基类(抽象类、泛型,其他类只需继承此类即可成为单例类) - /// 继承该类的,即成为一个单例类 - /// - public abstract class Singleton - where T : class, new() + public abstract class Singleton where T : class, new() { - private static T _instance = null; + private static readonly object _syncLock = new object(); + private static T _instance; public static T Instance { @@ -36,41 +27,32 @@ public static T Instance { if (_instance == null) { - _instance = new T(); - return _instance; + lock (_syncLock) + { + if (_instance == null) + { + _instance = new T(); + } + } } return _instance; } } - - protected virtual void Awake() - { - _instance = this as T; - } } - - /// - /// 继承自Singleton的单例 - /// public class SingletonA : Singleton { public void DoSomething() { - Debug.Log("SingletonA:DoSomething!"); + Debug.Log("SingletonA: DoSomething!"); } } - /// - /// 继承自Singleton的单例 - /// public class SingletonB : Singleton { public void DoSomething() { - Debug.Log("SingletonB:DoSomething!"); + Debug.Log("SingletonB: DoSomething!"); } } - - } \ No newline at end of file diff --git a/Assets/Creational Patterns/Singleton Pattern/Structure/SingletonStructure.cs b/Assets/Creational Patterns/Singleton Pattern/Structure/SingletonStructure.cs index 478c89f..2530a41 100644 --- a/Assets/Creational Patterns/Singleton Pattern/Structure/SingletonStructure.cs +++ b/Assets/Creational Patterns/Singleton Pattern/Structure/SingletonStructure.cs @@ -8,14 +8,11 @@ public class SingletonStructure : MonoBehaviour { - void Start() { - // Constructor is protected -- cannot use new - Singleton s1 = Singleton.Instance(); - Singleton s2 = Singleton.Instance(); + var s1 = Singleton.Instance; + var s2 = Singleton.Instance; - // Test for same instance if (s1 == s2) { Debug.Log("Objects are the same instance"); @@ -23,27 +20,21 @@ void Start() } } -/// -/// The 'Singleton' class -/// -class Singleton +public class Singleton { private static Singleton _instance; - // Constructor is 'protected' - protected Singleton() - { - } + protected Singleton() { } - public static Singleton Instance() + public static Singleton Instance { - // Uses lazy initialization. - // Note: this is not thread safe. - if (_instance == null) + get { - _instance = new Singleton(); + if (_instance == null) + { + _instance = new Singleton(); + } + return _instance; } - - return _instance; } } \ No newline at end of file diff --git a/Unity-Design-Pattern.sln b/Unity-Design-Pattern.sln index 39ac0e6..2ea3f1d 100644 --- a/Unity-Design-Pattern.sln +++ b/Unity-Design-Pattern.sln @@ -1,7 +1,7 @@  -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity-Design-Pattern", "Unity-Design-Pattern.csproj", "{AA5D6718-EC1F-D1EA-526D-52AF3C037FBB}" +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity-Design-Pattern", "Assembly-CSharp.csproj", "{8ABF50DE-5C45-E1BE-2FA5-8FD59671116B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,12 +9,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AA5D6718-EC1F-D1EA-526D-52AF3C037FBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA5D6718-EC1F-D1EA-526D-52AF3C037FBB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA5D6718-EC1F-D1EA-526D-52AF3C037FBB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA5D6718-EC1F-D1EA-526D-52AF3C037FBB}.Release|Any CPU.Build.0 = Release|Any CPU + {8ABF50DE-5C45-E1BE-2FA5-8FD59671116B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8ABF50DE-5C45-E1BE-2FA5-8FD59671116B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8ABF50DE-5C45-E1BE-2FA5-8FD59671116B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8ABF50DE-5C45-E1BE-2FA5-8FD59671116B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = Assembly-CSharp.csproj + EndGlobalSection EndGlobal