{"id":4678,"date":"2023-05-24T10:36:48","date_gmt":"2023-05-24T13:36:48","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?p=4678"},"modified":"2023-10-21T21:37:27","modified_gmt":"2023-10-22T00:37:27","slug":"padrao-de-design-singleton-implementacao-e-exemplos-de-uso","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/padrao-de-design-singleton-implementacao-e-exemplos-de-uso\/","title":{"rendered":"Padr\u00e3o de design Singleton: Implementa\u00e7\u00e3o e Exemplos de Uso"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Entendendo o Padr\u00e3o <em>Singleton<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 o Padr\u00e3o <em>Singleton<\/em>?<\/h3>\n\n\n\n<p>O padr\u00e3o <em>Singleton<\/em> \u00e9 um padr\u00e3o de projeto que garante a exist\u00eancia de apenas uma inst\u00e2ncia de uma determinada classe durante a execu\u00e7\u00e3o do programa. Ele fornece um ponto de acesso global a essa inst\u00e2ncia, facilitando o seu uso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quando usar o Padr\u00e3o <em>Singleton<\/em>?<\/h3>\n\n\n\n<p>O <em>Singleton<\/em> \u00e9 \u00fatil quando precisamos de uma \u00fanica inst\u00e2ncia de uma classe para controlar a\u00e7\u00f5es. \u00c9 comum em casos onde se precisa coordenar a\u00e7\u00f5es em um sistema ou quando objetos mais pesados, como conex\u00f5es de banco de dados, precisam ser gerenciados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementa\u00e7\u00e3o do Padr\u00e3o <em>Singleton<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Implementa\u00e7\u00e3o B\u00e1sica<\/h3>\n\n\n\n<p>A implementa\u00e7\u00e3o b\u00e1sica do padr\u00e3o <em>Singleton<\/em> envolve a cria\u00e7\u00e3o de uma classe com um m\u00e9todo que cria uma nova inst\u00e2ncia da classe se uma ainda n\u00e3o existir. Se uma inst\u00e2ncia j\u00e1 existir, ele simplesmente a retorna.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\npublic class Singleton\n{\n    private static Singleton instance;\n    \n    \/\/ Construtor privado para evitar instancia\u00e7\u00e3o direta\n    private Singleton()\n    {\n        Console.WriteLine(&quot;Inst\u00e2ncia criada.&quot;);\n    }\n    \n    \/\/ M\u00e9todo est\u00e1tico para obter a inst\u00e2ncia \u00fanica\n    public static Singleton GetInstance()\n    {\n        if (instance == null)\n        {\n            instance = new Singleton();\n        }\n        \n        return instance;\n    }\n    \n    public void SomeMethod()\n    {\n        Console.WriteLine(&quot;Executando m\u00e9todo da inst\u00e2ncia Singleton.&quot;);\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        \/\/ Obter a inst\u00e2ncia do Singleton\n        Singleton singleton1 = Singleton.GetInstance();\n        singleton1.SomeMethod(); \/\/ Executar m\u00e9todo na inst\u00e2ncia\n        \n        \/\/ Obter a mesma inst\u00e2ncia novamente\n        Singleton singleton2 = Singleton.GetInstance();\n        singleton2.SomeMethod(); \/\/ Executar m\u00e9todo na inst\u00e2ncia novamente\n        \n        \/\/ Verificar se as inst\u00e2ncias s\u00e3o iguais\n        Console.WriteLine(singleton1 == singleton2); \/\/ Retorna true, pois \u00e9 a mesma inst\u00e2ncia\n        \n        \/\/ Tentar criar uma nova inst\u00e2ncia diretamente\n        \/\/ Singleton singleton3 = new Singleton(); \/\/ Isso n\u00e3o \u00e9 permitido, pois o construtor \u00e9 privado\n    }\n}\n\n\/\/ Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Construtor privado para evitar instancia\u00e7\u00e3o direta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Inst\u00e2ncia criada.<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ M\u00e9todo est\u00e1tico para obter a inst\u00e2ncia \u00fanica<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton <\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">SomeMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Executando m\u00e9todo da inst\u00e2ncia Singleton.<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Obter a inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Singleton singleton1 <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Singleton<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">singleton1<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">SomeMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/ Executar m\u00e9todo na inst\u00e2ncia<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Obter a mesma inst\u00e2ncia novamente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Singleton singleton2 <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Singleton<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">singleton2<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">SomeMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/ Executar m\u00e9todo na inst\u00e2ncia novamente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Verificar se as inst\u00e2ncias s\u00e3o iguais<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">singleton1<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">singleton2<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/ Retorna true, pois \u00e9 a mesma inst\u00e2ncia<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Tentar criar uma nova inst\u00e2ncia diretamente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Singleton singleton3 = new Singleton(); \/\/ Isso n\u00e3o \u00e9 permitido, pois o construtor \u00e9 privado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, a classe <code>Singleton<\/code> implementa o padr\u00e3o <em>Singleton<\/em>. Ela possui um construtor privado para evitar a cria\u00e7\u00e3o direta de inst\u00e2ncias e um m\u00e9todo est\u00e1tico <code>GetInstance()<\/code> que retorna a inst\u00e2ncia \u00fanica. Quando o m\u00e9todo <code>GetInstance()<\/code> \u00e9 chamado pela primeira vez, uma nova inst\u00e2ncia \u00e9 criada. Nas chamadas subsequentes, a mesma inst\u00e2ncia \u00e9 retornada.<\/p>\n\n\n\n<p>No m\u00e9todo <code>Main<\/code>, demonstramos o uso do padr\u00e3o <em>Singleton<\/em> ao obter a inst\u00e2ncia do <em>Singleton<\/em> e executar um m\u00e9todo na mesma. Em seguida, obtemos a inst\u00e2ncia novamente e verificamos se \u00e9 a mesma inst\u00e2ncia, o que retorna <code>true<\/code>. Al\u00e9m disso, mostramos que a tentativa de criar uma nova inst\u00e2ncia diretamente \u00e9 impedida pelo construtor privado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementa\u00e7\u00e3o com <em>thread-safe<\/em><\/h3>\n\n\n\n<p>Em ambientes <em>multithread<\/em>, a implementa\u00e7\u00e3o b\u00e1sica pode levar a problemas. Nesses casos, podemos adicionar um bloqueio de <em>thread<\/em> (sincroniza\u00e7\u00e3o) para garantir que apenas um <em>thread<\/em> possa criar uma inst\u00e2ncia.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\npublic class Singleton\n{\n    private static Singleton instance;\n    private static readonly object lockObject = new object();\n\n    \/\/ Construtor privado para evitar instancia\u00e7\u00e3o direta\n    private Singleton()\n    {\n    }\n\n    \/\/ M\u00e9todo p\u00fablico est\u00e1tico que retorna a \u00fanica inst\u00e2ncia da classe\n    public static Singleton GetInstance()\n    {\n        \/\/ Verifica se a inst\u00e2ncia j\u00e1 foi criada\n        if (instance == null)\n        {\n            \/\/ Bloqueia o acesso simult\u00e2neo de m\u00faltiplas threads\n            lock (lockObject)\n            {\n                \/\/ Verifica novamente se a inst\u00e2ncia ainda \u00e9 nula (pode ter sido criada por outra thread)\n                if (instance == null)\n                {\n                    \/\/ Cria uma nova inst\u00e2ncia da classe\n                    instance = new Singleton();\n                }\n            }\n        }\n\n        \/\/ Retorna a inst\u00e2ncia existente ou a rec\u00e9m-criada\n        return instance;\n    }\n\n    public void PrintMessage(string message)\n    {\n        Console.WriteLine(message);\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        \/\/ Obtem a inst\u00e2ncia do Singleton\n        Singleton singleton1 = Singleton.GetInstance();\n\n        \/\/ Chama o m\u00e9todo da inst\u00e2ncia\n        singleton1.PrintMessage(&quot;Ol\u00e1, eu sou a inst\u00e2ncia 1!&quot;);\n\n        \/\/ Obtem outra inst\u00e2ncia do Singleton\n        Singleton singleton2 = Singleton.GetInstance();\n\n        \/\/ Chama o m\u00e9todo da inst\u00e2ncia\n        singleton2.PrintMessage(&quot;Ol\u00e1, eu sou a inst\u00e2ncia 2!&quot;);\n\n        \/\/ Verifica se as duas inst\u00e2ncias s\u00e3o iguais\n        Console.WriteLine(&quot;As duas inst\u00e2ncias s\u00e3o iguais? &quot; + (singleton1 == singleton2));\n\n        \/\/ Aguarda a press\u00e3o de uma tecla para encerrar o programa\n        Console.ReadKey();\n    }\n}\n\n\/\/ Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">readonly<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">object<\/span><span style=\"color: #D8DEE9FF\"> lockObject <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">object<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Construtor privado para evitar instancia\u00e7\u00e3o direta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ M\u00e9todo p\u00fablico est\u00e1tico que retorna a \u00fanica inst\u00e2ncia da classe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton <\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Verifica se a inst\u00e2ncia j\u00e1 foi criada<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">            <\/span><span style=\"color: #616E88\">\/\/ Bloqueia o acesso simult\u00e2neo de m\u00faltiplas threads<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">lock<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">lockObject<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">                <\/span><span style=\"color: #616E88\">\/\/ Verifica novamente se a inst\u00e2ncia ainda \u00e9 nula (pode ter sido criada por outra thread)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">                    <\/span><span style=\"color: #616E88\">\/\/ Cria uma nova inst\u00e2ncia da classe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Retorna a inst\u00e2ncia existente ou a rec\u00e9m-criada<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">PrintMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #D8DEE9FF\"> message<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Obtem a inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Singleton singleton1 <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Singleton<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama o m\u00e9todo da inst\u00e2ncia<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">singleton1<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">PrintMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Ol\u00e1, eu sou a inst\u00e2ncia 1!<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Obtem outra inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Singleton singleton2 <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Singleton<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">GetInstance<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama o m\u00e9todo da inst\u00e2ncia<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">singleton2<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">PrintMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Ol\u00e1, eu sou a inst\u00e2ncia 2!<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Verifica se as duas inst\u00e2ncias s\u00e3o iguais<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">As duas inst\u00e2ncias s\u00e3o iguais? <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">singleton1<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">singleton2<\/span><span style=\"color: #ECEFF4\">))<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Aguarda a press\u00e3o de uma tecla para encerrar o programa<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">ReadKey<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, a classe <code>Singleton<\/code> implementa o padr\u00e3o <em>Singleton<\/em>. O m\u00e9todo <code>GetInstance()<\/code> retorna a \u00fanica inst\u00e2ncia da classe, garantindo que apenas uma inst\u00e2ncia seja criada mesmo em ambientes <em>multithread<\/em>. A classe <code>Program<\/code> demonstra o uso do <em>Singleton<\/em>, onde s\u00e3o obtidas duas inst\u00e2ncias do <em>Singleton<\/em> e verificado se s\u00e3o iguais.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementa\u00e7\u00e3o com <em>Lazy Initialization<\/em><\/h3>\n\n\n\n<p>Em algumas situa\u00e7\u00f5es, queremos adiar a cria\u00e7\u00e3o da inst\u00e2ncia <em>Singleton<\/em> at\u00e9 o momento em que realmente precisamos dela. Isso \u00e9 chamado de <em>&#8220;lazy initialization&#8221;<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"public class Singleton\n{\n    \/\/ Vari\u00e1vel est\u00e1tica que armazena a \u00fanica inst\u00e2ncia do Singleton\n    private static Singleton instance;\n    \n    \/\/ Objeto de controle de acesso \u00e0 inst\u00e2ncia do Singleton\n    private static readonly object lockObject = new object();\n    \n    \/\/ Propriedade para acessar a inst\u00e2ncia do Singleton\n    public static Singleton Instance\n    {\n        get\n        {\n            \/\/ Verifica se a inst\u00e2ncia ainda n\u00e3o foi criada\n            if (instance == null)\n            {\n                \/\/ Utiliza o objeto de controle de acesso para garantir que apenas uma thread possa criar a inst\u00e2ncia\n                lock (lockObject)\n                {\n                    \/\/ Verifica novamente se a inst\u00e2ncia ainda n\u00e3o foi criada, pois outra thread pode ter criado enquanto aguardava o lock\n                    if (instance == null)\n                    {\n                        \/\/ Cria a inst\u00e2ncia do Singleton\n                        instance = new Singleton();\n                    }\n                }\n            }\n            \n            \/\/ Retorna a inst\u00e2ncia do Singleton\n            return instance;\n        }\n    }\n    \n    \/\/ Construtor privado para evitar a cria\u00e7\u00e3o direta do Singleton\n    private Singleton()\n    {\n        \/\/ Inicializa\u00e7\u00e3o do Singleton\n    }\n}\n\n\/\/ Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Vari\u00e1vel est\u00e1tica que armazena a \u00fanica inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Objeto de controle de acesso \u00e0 inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">readonly<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">object<\/span><span style=\"color: #D8DEE9FF\"> lockObject <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">object<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Propriedade para acessar a inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> Singleton Instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">get<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">            <\/span><span style=\"color: #616E88\">\/\/ Verifica se a inst\u00e2ncia ainda n\u00e3o foi criada<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">                <\/span><span style=\"color: #616E88\">\/\/ Utiliza o objeto de controle de acesso para garantir que apenas uma thread possa criar a inst\u00e2ncia<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">lock<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">lockObject<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">                    <\/span><span style=\"color: #616E88\">\/\/ Verifica novamente se a inst\u00e2ncia ainda n\u00e3o foi criada, pois outra thread pode ter criado enquanto aguardava o lock<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">                        <\/span><span style=\"color: #616E88\">\/\/ Cria a inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                        <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">            <\/span><span style=\"color: #616E88\">\/\/ Retorna a inst\u00e2ncia do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">instance<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Construtor privado para evitar a cria\u00e7\u00e3o direta do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Singleton<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Inicializa\u00e7\u00e3o do Singleton<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, utilizamos a t\u00e9cnica de &#8220;<em>lazy initialization<\/em>&#8221; para criar a inst\u00e2ncia do <em>Singleton<\/em> somente quando ela for necess\u00e1ria. A propriedade <code>Instance<\/code> \u00e9 respons\u00e1vel por retornar a inst\u00e2ncia existente ou criar uma nova inst\u00e2ncia se ela ainda n\u00e3o tiver sido criada. O objeto <code>lockObject<\/code> \u00e9 utilizado para controlar o acesso concorrente \u00e0 cria\u00e7\u00e3o da inst\u00e2ncia, garantindo que apenas uma <em>thread <\/em>possa criar o <em>Singleton<\/em>.<\/p>\n\n\n\n<p>\u00c9 importante ressaltar que essa implementa\u00e7\u00e3o com <em>lazy initialization <\/em>\u00e9 <em>thread-safe<\/em>, ou seja, garante que apenas uma inst\u00e2ncia do <em>Singleton<\/em> ser\u00e1 criada mesmo em ambientes com m\u00faltiplas <em>threads<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exemplos de Uso do Padr\u00e3o <em>Singleton<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Uso em Gerenciadores de Conex\u00e3o<\/h3>\n\n\n\n<p>Gerenciadores de conex\u00e3o s\u00e3o um exemplo cl\u00e1ssico de uso do padr\u00e3o <em>Singleton<\/em>. Eles gerenciam um recurso que \u00e9 caro para criar e manter, e onde normalmente s\u00f3 precisamos de uma inst\u00e2ncia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uso em <em>Loggers<\/em><\/h3>\n\n\n\n<p><em>Loggers<\/em> que escrevem em um arquivo ou enviam mensagens para um servidor tamb\u00e9m s\u00e3o comumente implementados como <em>Singletons<\/em>. Eles agregam todos os logs em um \u00fanico local, facilitando a an\u00e1lise e depura\u00e7\u00e3o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uso em Configura\u00e7\u00f5es do Sistema<\/h3>\n\n\n\n<p>As classes de configura\u00e7\u00e3o do sistema que mant\u00e9m um conjunto de par\u00e2metros que podem ser acessados globalmente tamb\u00e9m s\u00e3o um bom exemplo de uso do <em>Singleton<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vantagens e Desvantagens do Padr\u00e3o <em>Singleton<\/em><\/h2>\n\n\n\n<p>Como todo padr\u00e3o de <em>design<\/em>, o <em>Singleton<\/em> tem suas vantagens e desvantagens. Ele \u00e9 \u00fatil quando precisamos garantir que apenas uma inst\u00e2ncia de uma classe exista, mas pode ser problem\u00e1tico quando usado indevidamente, especialmente em ambientes <em>multithread<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Considera\u00e7\u00f5es Finais<\/h2>\n\n\n\n<p>O padr\u00e3o <em>Singleton<\/em> \u00e9 uma ferramenta poderosa em nosso arsenal de <em>design <\/em>de <em>software<\/em>. Como com qualquer ferramenta, devemos us\u00e1-la sabiamente e entender bem seus pr\u00f3s e contras antes de aplic\u00e1-la.<\/p>\n\n\n\n<p>Esse conte\u00fado \u00e9 parte do material disponibilizado para os participantes do meu grupo de estudos de\u00a0<strong>Padr\u00f5es de Projeto<\/strong>. Voc\u00ea quer participar desse grupo?\u00a0<strong><a href=\"https:\/\/elemarjr.com\/clube-de-estudos\/gof-design-patterns\/\">Clique aqui e veja como funciona<\/a><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00favidas Frequentes<\/h2>\n\n\n\n<p><strong>O padr\u00e3o <em>Singleton<\/em> \u00e9 considerado uma m\u00e1 pr\u00e1tica?<\/strong><br>N\u00e3o, o padr\u00e3o <em>Singleton<\/em> n\u00e3o \u00e9 uma m\u00e1 pr\u00e1tica, mas deve ser usado com cuidado, pois pode levar a problemas se usado incorretamente.<\/p>\n\n\n\n<p><strong>O padr\u00e3o <em>Singleton<\/em> pode ser usado em aplicativos <em>multi-thread<\/em>?<\/strong><br>Sim, mas precisa ser implementado corretamente para evitar condi\u00e7\u00f5es de corrida.<\/p>\n\n\n\n<p><strong><em>Singleton<\/em> e Global s\u00e3o a mesma coisa?<\/strong><br>N\u00e3o, embora ambos forne\u00e7am acesso global, <em>Singleton<\/em> garante uma \u00fanica inst\u00e2ncia, enquanto uma vari\u00e1vel global n\u00e3o.<\/p>\n\n\n\n<p><strong>Posso ter mais de um <em>Singleton<\/em> em minha aplica\u00e7\u00e3o?<\/strong><br>Sim, voc\u00ea pode ter v\u00e1rios tipos diferentes de <em>Singletons<\/em> em sua aplica\u00e7\u00e3o.<\/p>\n\n\n\n<p><strong>O que \u00e9 &#8220;<em>lazy initialization<\/em>&#8221; em <em>Singleton<\/em>?<\/strong><br>&#8220;<em>Lazy initialization<\/em>&#8221; \u00e9 a t\u00e9cnica de adiar a cria\u00e7\u00e3o da inst\u00e2ncia <em>Singleton<\/em> at\u00e9 o momento em que ela \u00e9 realmente necess\u00e1ria.<\/p>\n","protected":false},"featured_media":4760,"parent":0,"template":"","cursos":[7],"class_list":["post-4678","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-gof"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/4678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/4760"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=4678"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=4678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}