diff --git a/Behavioral/DesignPatterns.Visitor.UnitTests/DesignPatterns.Visitor.UnitTests.csproj b/Behavioral/DesignPatterns.Visitor.UnitTests/DesignPatterns.Visitor.UnitTests.csproj
index ffe9889..c9e5c6a 100644
--- a/Behavioral/DesignPatterns.Visitor.UnitTests/DesignPatterns.Visitor.UnitTests.csproj
+++ b/Behavioral/DesignPatterns.Visitor.UnitTests/DesignPatterns.Visitor.UnitTests.csproj
@@ -34,4 +34,4 @@
-
\ No newline at end of file
+
diff --git a/Behavioral/DesignPatterns.Visitor/DesignPatterns.Visitor.csproj b/Behavioral/DesignPatterns.Visitor/DesignPatterns.Visitor.csproj
index d272bea..c5059fd 100644
--- a/Behavioral/DesignPatterns.Visitor/DesignPatterns.Visitor.csproj
+++ b/Behavioral/DesignPatterns.Visitor/DesignPatterns.Visitor.csproj
@@ -5,11 +5,10 @@
net8.0
enable
enable
- DesignPatterns.Visitor
-
\ No newline at end of file
+
diff --git a/Creational/DesignPatterns.AbstractFactory.UnitTests/DesignPatterns.AbstractFactory.UnitTests.csproj b/Creational/DesignPatterns.AbstractFactory.UnitTests/DesignPatterns.AbstractFactory.UnitTests.csproj
index 031f9ab..b32966c 100644
--- a/Creational/DesignPatterns.AbstractFactory.UnitTests/DesignPatterns.AbstractFactory.UnitTests.csproj
+++ b/Creational/DesignPatterns.AbstractFactory.UnitTests/DesignPatterns.AbstractFactory.UnitTests.csproj
@@ -4,7 +4,6 @@
net8.0
enable
enable
- DesignPatterns.AbstractFactory.UnitTests
false
true
@@ -34,4 +33,4 @@
-
\ No newline at end of file
+
diff --git a/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj b/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj
index 16f68a7..2ff6788 100644
--- a/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj
+++ b/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj
@@ -5,7 +5,6 @@
net8.0
enable
enable
- DesignPatterns.AbstractFactory
@@ -19,4 +18,4 @@
-
\ No newline at end of file
+
diff --git a/Creational/DesignPatterns.Singleton.UnitTests/DesignPatterns.Singleton.UnitTests.csproj b/Creational/DesignPatterns.Singleton.UnitTests/DesignPatterns.Singleton.UnitTests.csproj
new file mode 100644
index 0000000..8ed623b
--- /dev/null
+++ b/Creational/DesignPatterns.Singleton.UnitTests/DesignPatterns.Singleton.UnitTests.csproj
@@ -0,0 +1,40 @@
+
+
+
+ net8.0
+ enable
+ enable
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLazyTests.cs b/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLazyTests.cs
new file mode 100644
index 0000000..cc45884
--- /dev/null
+++ b/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLazyTests.cs
@@ -0,0 +1,16 @@
+using Shouldly;
+using Xunit;
+
+namespace DesignPatterns.Singleton.UnitTests;
+
+public class SingletonWithLazyTests
+{
+ [Fact]
+ public void Given_WhenCreateSingletonWithLazy_ThenSameInstancesReturned()
+ {
+ var firstInstance = SingletonWithLazy.Instance;
+ var secondInstance = SingletonWithLazy.Instance;
+
+ firstInstance.ShouldBe(secondInstance);
+ }
+}
diff --git a/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLockTests.cs b/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLockTests.cs
new file mode 100644
index 0000000..904917d
--- /dev/null
+++ b/Creational/DesignPatterns.Singleton.UnitTests/SingletonWithLockTests.cs
@@ -0,0 +1,16 @@
+using Shouldly;
+using Xunit;
+
+namespace DesignPatterns.Singleton.UnitTests;
+
+public class SingletonWithLockTests
+{
+ [Fact]
+ public void Given_WhenCreateSingletonWithLock_ThenSameInstancesReturned()
+ {
+ var firstInstance = SingletonWithLock.Instance;
+ var secondInstance = SingletonWithLock.Instance;
+
+ firstInstance.ShouldBe(secondInstance);
+ }
+}
diff --git a/Creational/DesignPatterns.Singleton/DesignPatterns.Singleton.csproj b/Creational/DesignPatterns.Singleton/DesignPatterns.Singleton.csproj
index 3a63532..9079cb5 100644
--- a/Creational/DesignPatterns.Singleton/DesignPatterns.Singleton.csproj
+++ b/Creational/DesignPatterns.Singleton/DesignPatterns.Singleton.csproj
@@ -1,9 +1,14 @@
+ Exe
net8.0
enable
enable
+
+
+
+
diff --git a/Creational/DesignPatterns.Singleton/Program.cs b/Creational/DesignPatterns.Singleton/Program.cs
new file mode 100644
index 0000000..7193e17
--- /dev/null
+++ b/Creational/DesignPatterns.Singleton/Program.cs
@@ -0,0 +1,9 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+
+var host = Host.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration(ctx => ctx.AddJsonFile("appsettings.json"))
+ .ConfigureServices(services => { })
+ .Build();
+
+Console.WriteLine();
\ No newline at end of file
diff --git a/Creational/DesignPatterns.Singleton/SingletonWithLock.cs b/Creational/DesignPatterns.Singleton/SingletonWithLock.cs
index a7d9085..d12c870 100644
--- a/Creational/DesignPatterns.Singleton/SingletonWithLock.cs
+++ b/Creational/DesignPatterns.Singleton/SingletonWithLock.cs
@@ -3,7 +3,7 @@
public class SingletonWithLock
{
private static SingletonWithLock? instance = null;
- private static readonly object syncObject = new();
+ private static readonly object lockObj = new();
///
/// The private constructor is declared to prevent instantiation directly, via calling a default constructor.
@@ -19,7 +19,7 @@ public static SingletonWithLock Instance
{
// The cost of executing the lock operation is significantly higher
// in comparison to the straightforward pointer check `instance != null`.
- lock (syncObject)
+ lock (lockObj)
{
return instance ??= new SingletonWithLock();
}
diff --git a/DesignPatterns.sln b/DesignPatterns.sln
index e66c082..1312456 100644
--- a/DesignPatterns.sln
+++ b/DesignPatterns.sln
@@ -18,6 +18,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DesignPatterns.Decorator",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DesignPatterns.Singleton", "Creational\DesignPatterns.Singleton\DesignPatterns.Singleton.csproj", "{658DB1C6-AC85-4E03-99C4-C79116E558F5}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DesignPatterns.Singleton.UnitTests", "Creational\DesignPatterns.Singleton.UnitTests\DesignPatterns.Singleton.UnitTests.csproj", "{FFB0861F-5182-40CA-BD19-33BCB0FBA4F6}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -48,6 +50,10 @@ Global
{658DB1C6-AC85-4E03-99C4-C79116E558F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{658DB1C6-AC85-4E03-99C4-C79116E558F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{658DB1C6-AC85-4E03-99C4-C79116E558F5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FFB0861F-5182-40CA-BD19-33BCB0FBA4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FFB0861F-5182-40CA-BD19-33BCB0FBA4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFB0861F-5182-40CA-BD19-33BCB0FBA4F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FFB0861F-5182-40CA-BD19-33BCB0FBA4F6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{DCE06EB6-BAB5-4573-AF67-128DBCCDB90C} = {7FF0E83F-EBEB-4103-BCD1-2F100E82FCD1}
@@ -56,5 +62,6 @@ Global
{1E56CC89-45C1-45F7-9EC8-88D648572816} = {AE005ED4-5F0B-4AF9-81AE-AAE3AD6F8901}
{FA3C4F09-104E-4F7D-9ADB-E7F22917ADF7} = {5961ADCC-5FA6-4076-A9F4-C1D3207ABE1A}
{658DB1C6-AC85-4E03-99C4-C79116E558F5} = {AE005ED4-5F0B-4AF9-81AE-AAE3AD6F8901}
+ {FFB0861F-5182-40CA-BD19-33BCB0FBA4F6} = {AE005ED4-5F0B-4AF9-81AE-AAE3AD6F8901}
EndGlobalSection
EndGlobal