{"id":499,"date":"2012-07-11T21:34:36","date_gmt":"2012-07-11T21:34:36","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=499"},"modified":"2012-07-11T21:39:08","modified_gmt":"2012-07-11T21:39:08","slug":"explicacion-del-patron-singleton","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/explicacion-del-patron-singleton\/","title":{"rendered":"Explicaci\u00f3n del Patr\u00f3n Singleton en POO"},"content":{"rendered":"<p style=\"text-align: justify;\">Singleton, aunque suene a marca de tenis, corresponde realmente a un patr\u00f3n de dise\u00f1o de clases en el paradigma de la programaci\u00f3n orientada a objetos.<\/p>\n<p style=\"text-align: justify;\">Este patr\u00f3n o metodolog\u00eda de funcionamiento se da a la hora de dise\u00f1ar las clases, y nos permite que exista solo una \u00fanica instancia(objeto) de una clase.<\/p>\n<p style=\"text-align: justify;\">Aunque singleton en ingl\u00e9s se traduzca como semifallo. El significado m\u00e1s parecido es single: \u00fanico o sencillo, haciendo alusi\u00f3n a el acceso a una \u00fanica instancia.<\/p>\n<p>Pero me pregunto <strong><span style=\"color: #003366;\">\u00bf para qu\u00e9 queremos realizar esto, que finalidad tiene ?<\/span><\/strong><\/p>\n<p><!--more--><\/p>\n<p>La respuesta es sencilla: garantizar que siempre accedemos al mismo objeto o instancia.<\/p>\n<p><strong><span style=\"color: #003366;\">\u00bf Que ventajas me aporta ?<\/span><\/strong><\/p>\n<p>Acceder de manera universal y constante durante el transcurso del programa al los m\u00e9todos y el estado del objeto(instancia).<\/p>\n<p><strong><span style=\"color: #003366;\">Y como se supone que lo puedo usar:<\/span><\/strong><\/p>\n<p style=\"text-align: justify;\">Cuando necesite que una parte de la aplicaci\u00f3n que realmente son un conjunto de objetos en memoria o disco, accedan de manera \u00fanica a dicho objeto. Es decir, centralizamos el objeto para el resto del programa<strong> <\/strong>(desde cualquier parte).<\/p>\n<p>Ejemplo: Acceso a un objeto de seguridad que almacene datos confidenciales. O un log, o unos par\u00e1metros de la aplicaci\u00f3n globales.<\/p>\n<p><strong>\u00a0<span style=\"color: #003366;\">\u00bf Como lo represento ?<\/span><\/strong><\/p>\n<p>Como clase<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Singleton.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-508\" title=\"Singleton\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Singleton.jpg\" alt=\"\" width=\"354\" height=\"301\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Singleton.jpg 354w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Singleton-300x255.jpg 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/a><\/p>\n<p><span style=\"color: #003366;\"><strong>Ejemplo de uso real:<\/strong><\/span><\/p>\n<pre lang=\"vb\">Public Class Singleton\r\n\r\n    Private Sub New()\r\n    End Sub\r\n\r\n   \u2018 IMPORTANTISMO: Variable privada de acceso interno a la instancia singleton\r\n   Private Shared _instancia As Singleton\r\n\r\n    Public Shared ReadOnly Property Instancia() As Singleton\r\n        \u2018 Importante el uso del if es vital dentro de la clase para comprobar si no existe la instancia, puesto que de existir no crea el objeto, es ah\u00ed donde radica la esencia del patr\u00f3n.\r\nGet\r\n            If _instancia Is Nothing Then\r\n                _instancia = New Singleton\r\n            End If\r\n\r\n            Return _instancia\r\n        End Get\r\n    End Property\r\n\r\nEnd Class<\/pre>\n<p>&nbsp;<\/p>\n<p>Un ejemplo sencillo de un contador de visitas, accesible desde cualquier parte del programa mediante la llamada al met\u00f3do IncrementarContador<\/p>\n<pre lang=\"VB\">public sealed class Singleton\r\n{\r\n  \/\/ Almacenamos las visitas del sitio en una variable \r\n   private int contador = 0;\r\n   private static volatile Singleton instance = null;\r\n\r\n   private Singleton() {}\r\n\r\n   public static int IncrementarContador()\r\n   {\r\n\r\n           if (instance == null)\r\n              instance = new Singleton();\r\n\r\n     return instance.contador++;\r\n   }\r\n}<\/pre>\n<p>Si uso desde el exterior por el programa: Singleton.IncrementarContador ();<br \/>\nEste m\u00e9todo es de tipo set, pero la funcionalidad de la clase podr\u00eda verse afectada por mas propiedades, y m\u00e9todos.<\/p>\n<p>En este sencillo ejemplo no se contempla la exclusi\u00f3n. Es decir, que dos objetos accedan al mismo dato. Para ello existen variantes de este patr\u00f3n.<\/p>\n<p><span style=\"color: #000080;\"><strong>Resumiendo<\/strong>:<\/span><\/p>\n<p style=\"text-align: justify;\">Utilizaremos singleton en aquellas aplicaciones en las que dicha clase controla el acceso a un recurso f\u00edsico \u00fanico (como puede ser el rat\u00f3n o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los dem\u00e1s objetos de la aplicaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Singleton, aunque suene a marca de tenis, corresponde realmente a un patr\u00f3n de dise\u00f1o de clases en el paradigma de la programaci\u00f3n orientada a objetos. Este patr\u00f3n o metodolog\u00eda de funcionamiento se da a la hora de dise\u00f1ar las clases, y nos permite que exista solo una \u00fanica instancia(objeto) de una clase. Aunque singleton en ingl\u00e9s se traduzca como semifallo. El significado m\u00e1s parecido es single: \u00fanico o sencillo, haciendo alusi\u00f3n a el acceso a una \u00fanica instancia. Pero me pregunto \u00bf para qu\u00e9 queremos realizar esto, que finalidad tiene ?<\/p>\n","protected":false},"author":1,"featured_media":507,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41,5],"tags":[47,62,60,63,61,44],"class_list":["post-499","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ingenieria-del-software","category-programacion","tag-ingenieria-del-software-2","tag-objetos","tag-opp","tag-paradigma","tag-poo","tag-programacion-2"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=499"}],"version-history":[{"count":15,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/499\/revisions"}],"predecessor-version":[{"id":516,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/499\/revisions\/516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/507"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}