Add singleton example
This commit is contained in:
parent
27045cc4b9
commit
1454650156
6 changed files with 118 additions and 0 deletions
15
Singleton/LazySingleton.cs
Normal file
15
Singleton/LazySingleton.cs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
public sealed class LazySingleton
|
||||||
|
{
|
||||||
|
private LazySingleton() { }
|
||||||
|
private static readonly Lazy<LazySingleton> _lazy = new Lazy<LazySingleton>(() => new LazySingleton());
|
||||||
|
|
||||||
|
public static LazySingleton GetInstance(string value)
|
||||||
|
{
|
||||||
|
var instance = _lazy.Value;
|
||||||
|
instance.Value = value;
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
9
Singleton/NonSingleton.cs
Normal file
9
Singleton/NonSingleton.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
public sealed class NonSingleton
|
||||||
|
{
|
||||||
|
public NonSingleton(string value)
|
||||||
|
{
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
37
Singleton/Program.cs
Normal file
37
Singleton/Program.cs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
var nonSingleton1 = new NonSingleton("A");
|
||||||
|
var nonSingleton2 = new NonSingleton("B");
|
||||||
|
Console.WriteLine(nonSingleton1.Value);
|
||||||
|
Console.WriteLine(nonSingleton2.Value);
|
||||||
|
TestSingleton(nonSingleton1, nonSingleton2);
|
||||||
|
|
||||||
|
var simpleSingleton1 = SimpleSingleton.GetInstance("A");
|
||||||
|
var simpleSingleton2 = SimpleSingleton.GetInstance("B");
|
||||||
|
Console.WriteLine(simpleSingleton1.Value);
|
||||||
|
Console.WriteLine(simpleSingleton2.Value);
|
||||||
|
TestSingleton(simpleSingleton1, simpleSingleton2);
|
||||||
|
|
||||||
|
|
||||||
|
var threadSafeSingleton1 = ThreadSafeSingleton.GetInstance("A");
|
||||||
|
var threadSafeSingleton2 = ThreadSafeSingleton.GetInstance("B");
|
||||||
|
Console.WriteLine(threadSafeSingleton1.Value);
|
||||||
|
Console.WriteLine(threadSafeSingleton2.Value);
|
||||||
|
TestSingleton(threadSafeSingleton1, threadSafeSingleton2);
|
||||||
|
|
||||||
|
|
||||||
|
var lazySingleton1 = LazySingleton.GetInstance("A");
|
||||||
|
var lazySingleton2 = LazySingleton.GetInstance("B");
|
||||||
|
Console.WriteLine(lazySingleton1.Value);
|
||||||
|
Console.WriteLine(lazySingleton2.Value);
|
||||||
|
TestSingleton(lazySingleton1, lazySingleton2);
|
||||||
|
|
||||||
|
static void TestSingleton<T>(T object1, T object2) where T : class
|
||||||
|
{
|
||||||
|
if (object1 == object2)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"{typeof(T).FullName}: These are singletons");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"{typeof(T).FullName}: These are NOT singletons");
|
||||||
|
}
|
||||||
|
}
|
18
Singleton/SimpleSingleton.cs
Normal file
18
Singleton/SimpleSingleton.cs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
public sealed class SimpleSingleton
|
||||||
|
{
|
||||||
|
private SimpleSingleton() { }
|
||||||
|
|
||||||
|
private static SimpleSingleton _instance;
|
||||||
|
|
||||||
|
public static SimpleSingleton GetInstance(string value)
|
||||||
|
{
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
_instance = new SimpleSingleton();
|
||||||
|
_instance.Value = value;
|
||||||
|
}
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
10
Singleton/Singleton.csproj
Normal file
10
Singleton/Singleton.csproj
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
29
Singleton/ThreadSafeSingleton.cs
Normal file
29
Singleton/ThreadSafeSingleton.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
public sealed class ThreadSafeSingleton
|
||||||
|
{
|
||||||
|
private ThreadSafeSingleton() { }
|
||||||
|
|
||||||
|
private static readonly object _lock = new object();
|
||||||
|
|
||||||
|
private static ThreadSafeSingleton _instance;
|
||||||
|
|
||||||
|
public static ThreadSafeSingleton GetInstance(string value)
|
||||||
|
{
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
lock (_lock)
|
||||||
|
{
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
_instance = new ThreadSafeSingleton();
|
||||||
|
_instance.Value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
Loading…
Reference in a new issue