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