freeCodeCamp/guide/russian/software-engineering/design-patterns/singleton/index.md

5.9 KiB
Raw Blame History

title localeTitle
Singleton одиночка

Синглтон - это шаблон проектирования, который ограничивает экземпляр класса одним объектом. Это полезно, когда вы хотите дать только одному объекту возможность координировать действия в вашем приложении.

Синглтон в Android

Синглтон - шаблон дизайна, часто используемый в Android. Это легко использовать неправильно, и поэтому приложение может быть трудно поддерживать. Это полезно в Android, потому что они живут через фрагменты, действия и вращения.

  • Синглтоны часто используются в Android для хранения временных данных
  • Они позволяют приложению иметь одного владельца данных и обеспечивают простой способ передачи данных между классами контроллера
  • Синглтоны уничтожаются, когда Android удаляет ваше приложение из памяти
  • Синглтоны могут затруднить модульное тестирование вашего приложения
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

Частный конструктор используется для предотвращения прямого создания объектов из класса. Единственный способ создать экземпляр из класса - использовать статический метод, который создает объект, только если он еще не был создан.

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 \ типа от .NET 4.0 или выше.

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.

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 

тестирование

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

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 свойства и методы инициализируются по умолчанию, что означает, что он не будет создан до его вызова, поэтому он обеспечивает некоторую оптимизацию.

Больше информации

Для получения дополнительной информации посетите следующие ссылки: