Files
freeCodeCamp/guide/chinese/software-engineering/design-patterns/singleton/index.md
2018-10-16 21:32:40 +05:30

155 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Singleton
localeTitle: 独生子
---
单例是一种设计模式,它将类的实例化限制为一个对象。当您只想让一个对象能够协调整个应用程序中的操作时,它非常有用。
## Android中的Singleton
Singleton是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中实现Singleton。
```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中的Singleton
```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在C中实现Singleton](https://msdn.microsoft.com/en-us/library/ff650316.aspx)
* [C深度。在C中实现Singleton模式](http://csharpindepth.com/Articles/General/Singleton.aspx)