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

4.1 KiB
Raw Blame History

title localeTitle
Singleton 独生子

单例是一种设计模式,它将类的实例化限制为一个对象。当您只想让一个对象能够协调整个应用程序中的操作时,它非常有用。

Android中的Singleton

Singleton是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中实现Singleton。

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中的Singleton

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属性和方法默认是惰性初始化,这意味着它在被调用之前不会被实例化,因此它提供了一些优化。

更多信息

有关更多信息,请访问以下链接: