155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Singleton | |||
|  | localeTitle: одиночка | |||
|  | --- | |||
|  | Синглтон - это шаблон проектирования, который ограничивает экземпляр класса одним объектом. Это полезно, когда вы хотите дать только одному объекту возможность координировать действия в вашем приложении. | |||
|  | 
 | |||
|  | ## Синглтон в Android
 | |||
|  | 
 | |||
|  | Синглтон - шаблон дизайна, часто используемый в Android. Это легко использовать неправильно, и поэтому приложение может быть трудно поддерживать. Это полезно в Android, потому что они живут через фрагменты, действия и вращения. | |||
|  | 
 | |||
|  | *   Синглтоны часто используются в Android для хранения временных данных | |||
|  | *   Они позволяют приложению иметь одного владельца данных и обеспечивают простой способ передачи данных между классами контроллера | |||
|  | *   Синглтоны уничтожаются, когда Android удаляет ваше приложение из памяти | |||
|  | *   Синглтоны могут затруднить модульное тестирование вашего приложения | |||
|  | 
 | |||
|  | ```java | |||
|  | public class DataStore {  | |||
|  |   private static DataStore sDataStore;  | |||
|  |   private List<Data> mData;  | |||
|  |   | |||
|  |   public static DataStore get(Context context) {  | |||
|  |     if (sDataStore == null) {  | |||
|  |       sDataStore = new DataStore(context);  | |||
|  |     }  | |||
|  |     return sDataStore;  | |||
|  |   }  | |||
|  |   | |||
|  |   // Make constructor private to prevent other classes from creating a DataStore instance  | |||
|  |   private DataStore(Context context) {  | |||
|  |     mData = new ArrayList<>();  | |||
|  |   }  | |||
|  |   | |||
|  |   // The only way for other classes to get data from DataStore  | |||
|  |   public List<Data> getData() {  | |||
|  |     return mData;  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Синглтон в PHP
 | |||
|  | 
 | |||
|  | > Частный конструктор используется для предотвращения прямого создания объектов из класса. Единственный способ создать экземпляр из класса - использовать статический метод, который создает объект, только если он еще не был создан.
 | |||
|  | 
 | |||
|  | ```php | |||
|  | Class Singleton {  | |||
|  |   | |||
|  |   // Hold the class instance  | |||
|  |   private static $instance = null;  | |||
|  |   | |||
|  |   /**  | |||
|  |   * The constructor is private  | |||
|  |   * it is ensure the class can be initialized only from itself  | |||
|  |   */  | |||
|  |   private function __construct(){}  | |||
|  |   | |||
|  |   /**  | |||
|  |   * Return the singleton instance of this class  | |||
|  |   *  | |||
|  |   * @return Singleton  | |||
|  |   */  | |||
|  |   public static function getInstance()  | |||
|  |   {  | |||
|  |     if (self::$instance == null)  | |||
|  |     {  | |||
|  |       self::$instance = new Singleton();  | |||
|  |     }  | |||
|  |   | |||
|  |     return self::$instance;  | |||
|  |   }  | |||
|  |   | |||
|  |  }  | |||
|  |   | |||
|  |  $obj1 = Singleton::getInstance();  | |||
|  |  $obj2 = Singleton::getInstance();  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Синглтон в C
 | |||
|  | 
 | |||
|  | Самая элегантная, простая и высокоэффективная версия шаблона с использованием [System.Lazy \\](http://msdn.microsoft.com/en-us/library/dd642331.aspx) типа от .NET 4.0 или выше. | |||
|  | 
 | |||
|  | ```csharp | |||
|  | public sealed class Singleton  | |||
|  |  {  | |||
|  |     private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());  | |||
|  |   | |||
|  |     public static Singleton Instance { get { return lazy.Value; } }  | |||
|  |   | |||
|  |     private Singleton()  | |||
|  |     {  | |||
|  |     }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Синглтон в Python3
 | |||
|  | 
 | |||
|  | Мы можем использовать метакласс для реализации Singleton в Python3. | |||
|  | 
 | |||
|  | ```python | |||
|  | class Singleton(type):  | |||
|  |     # Mapping from a class to its singleton instance  | |||
|  |     _instances = {}  | |||
|  |   | |||
|  |     def __call__(cls, *args, **kwargs):  | |||
|  |         if cls not in Singleton._instances:  | |||
|  |             Singleton._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)  | |||
|  |   | |||
|  |         return Singleton._instances[cls]  | |||
|  |   | |||
|  |   | |||
|  |  class MyClass(metaclass=Singleton):  | |||
|  |     pass  | |||
|  | ``` | |||
|  | 
 | |||
|  | ### тестирование
 | |||
|  | 
 | |||
|  | ```python | |||
|  | obj_0 = MyClass()  | |||
|  |  obj_1 = MyClass()  | |||
|  |   | |||
|  |  In [2]: obj_0  | |||
|  |  Out[2]: <__main__.MyClass at 0x111130da0>  | |||
|  |   | |||
|  |  In [3]: obj_1  | |||
|  |  Out[3]: <__main__.MyClass at 0x111130da0>  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Синглтон в iOS
 | |||
|  | 
 | |||
|  | ```Swift4 | |||
|  | class Singleton {  | |||
|  |   static let sharedInstance = Singleton()  | |||
|  |   | |||
|  |     init() {  | |||
|  |         print("Singleton has been initialized")  | |||
|  |     }  | |||
|  |   | |||
|  |     //write your functions here  | |||
|  |     func sampleFunction() {  | |||
|  |     }  | |||
|  |  }  | |||
|  |   | |||
|  |  //Uses  | |||
|  |  Singleton.sharedInstance.sampleFunction()  | |||
|  | ``` | |||
|  | 
 | |||
|  | Этот простой код предназначен для реализации одноэлементного дизайна в iOS с использованием Swift. Мы ставим `static` потому что это свойство типа, и его функциональность заключается в создании только одного экземпляра объекта и предотвращении его переопределения. Использование `let` гарантирует, что значение sharedInstance не изменится. | |||
|  | 
 | |||
|  | Важно отметить, что `static` свойства и методы инициализируются по умолчанию, что означает, что он не будет создан до его вызова, поэтому он обеспечивает некоторую оптимизацию. | |||
|  | 
 | |||
|  | ## Больше информации
 | |||
|  | 
 | |||
|  | Для получения дополнительной информации посетите следующие ссылки: | |||
|  | 
 | |||
|  | *   [MSDN: реализация Singleton в C #](https://msdn.microsoft.com/en-us/library/ff650316.aspx) | |||
|  | *   [C # в глубину. Внедрение шаблона Singleton в C #](http://csharpindepth.com/Articles/General/Singleton.aspx) |