标签: singleton

C++ singleton vs完全静态对象

假设我们需要在项目中只有一个类的一个实例.有几种方法可以做到这一点.

我想比较一下.请你复习一下我的理解.

1)古典单身模式

2)完全静态类(所有方法和成员都是静态的).


据我所知,差异如下:

a)未定义跨不同单元的静态成员的初始化顺序.因此,完全静态成员初始化不能使用来自其他模块的任何静态成员/函数.而单身人士没有这个问题.

b)我们必须处理Singleton的getInstance()的线程.但是,完全静态类没有这个问题.

c)访问方法看起来有点不同.FOO ::巴(); vs Foo :: getInstance() - > bar(); 通常,singleton可以返回NULL来识别构造对象时存在一些问题而静态类不能.

d)对于静态类的一堆静态,类的定义看起来有点笨拙.

我错过了什么吗?

c++ singleton static class

34
推荐指数
3
解决办法
3万
查看次数

在Swift中变量值发生变化时执行方法

我需要在变量值改变时执行一个函数.

我有一个包含一个名为的共享变量的单例类labelChange.此变量的值取自另一个名为的类Model.我有两个VC类,其中一个有按钮和标签,第二个只有一个按钮.

当按下第一个VC类中的按钮时,我正在用这个func更新标签:

func updateLabel(){
    self.label.text = SharingManager.sharedInstance.labelChange
}
Run Code Online (Sandbox Code Playgroud)

但是每当labelChange更改值时我想调用相同的方法.因此,在按钮单击中,我将只更新labelChange值,当这件事发生时,我想用新的值更新标签labelChange.同样在第二个VC中,我可以更新labelChange值,但是当更改此值时,我无法更新标签.

也许属性是解决方案,但任何人都可以告诉我如何这样做.

第二次编辑:

单身人士课程:

class SharingManager {
    func updateLabel() {
        println(labelChange)
        ViewController().label.text = SharingManager.sharedInstance.labelChange     
    }
    var labelChange: String = Model().callElements() {
        willSet {
            updateLabel()
        }
    }
    static let sharedInstance = SharingManager()
}
Run Code Online (Sandbox Code Playgroud)

第一个VC:

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBAction func Button(sender: UIButton) {    
       SViewController().updateMessageAndDismiss()
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个VC:

func updateMessageAndDismiss() {
        SharingManager.sharedInstance.labelChange = modelFromS.callElements()
        self.dismissViewControllerAnimated(true, completion: …
Run Code Online (Sandbox Code Playgroud)

singleton properties ios swift

34
推荐指数
4
解决办法
5万
查看次数

线程安全实例化单例

使用哪种同步方法来确保单例仍然是单例?

+(Foo*)sharedInstance
{
   @synchronized(self)
   {
      if (nil == _sharedInstance)
      {
         _sharedInstance = [[Foo alloc] init];
         ...
      }
   }
   return _sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

还是使用互斥?

#import <pthread.h>

static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;

+(Foo*)sharedInstance
{
   pthread_mutex_lock(&_mutex);
   if (nil == _sharedInstance)
   {
      _sharedInstance = [[Foo alloc] init];
      ...
   }
   pthread_mutex_unlock(&_mutex);
   return _sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

嗯..对此有何评论?

singleton multithreading memory-management objective-c thread-safety

33
推荐指数
3
解决办法
2万
查看次数

带参数的单身人士

我需要一个单例类来实例化一些参数.我现在这样做的方式是:

class SingletonExample
{
     private SingletonExample mInstance;
     //other members... 
     private SingletonExample()
     {

     } 
     public SingletonExample Instance
     {
         get
         {
              if (mInstance == null)
              {
                  throw new Exception("Object not created");
              }
              return mInstance;
         }
     }

     public void Create(string arg1, string arg2)
     {
         mInstance = new SingletonExample();
         mInstance.Arg1 = arg1;
         mInstance.ObjectCaller = new ObjectCaller(arg2);
         //etc... basically, create object...
     } 
}
Run Code Online (Sandbox Code Playgroud)

该实例是"迟到"创建的,这意味着我没有在app启动时获得所有必需的参数.

一般来说,我不喜欢强制方法调用的排序,但我在这里看不到另一种方式.IoC也不会解决它,因为我可以在容器中注册它,我也可以调用Create()...

你认为这是一个好的方案吗?你有其他想法吗?

编辑:我知道我写的一个例子,它不是线程安全的,线程安全不是问题的一部分

c# parameters singleton arguments design-patterns

33
推荐指数
3
解决办法
5万
查看次数

使用双锁时使单例实例易变的重点是什么?

private volatile static Singleton uniqueInstance
Run Code Online (Sandbox Code Playgroud)

在单独使用双锁方法进行同步时,为什么单个实例声明为volatile?我可以在不将其声明为volatile的情况下实现相同的功能吗?

java singleton volatile double-checked-locking thread-synchronization

33
推荐指数
3
解决办法
2万
查看次数

Unity单例管理器类

在Unity中,有什么方法可以创建一个单独的游戏管理器,可以作为全局类在任何地方访问,静态变量会将相同的常量值吐出到每个提取这些值的类中?在Unity中实现它的方法是什么?我必须将它附加到GameObject吗?可以只是在文件夹中,而不是在视觉上在场景中吗?

c# singleton design-patterns unity-game-engine

33
推荐指数
2
解决办法
2万
查看次数

为多个接口返回相同的实例

我正在使用以下代码注册组件:

StandardKernel kernel = new StandardKernel();

string currentDirectory = Path.GetDirectoryName(GetType().Assembly.Location)
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    if (!Path.GetDirectoryName(assembly.Location).Equals(currentDirectory)) 
        continue;

    foreach (var type in assembly.GetTypes())
    {
        if (!type.IsComponent()) 
            continue;

        foreach (var @interface in type.GetInterfaces())
        kernel.Bind(@interface).To(type).InSingletonScope();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个实现两个接口的类:

class StandardConsole : IStartable, IConsumer<ConsoleCommand>
Run Code Online (Sandbox Code Playgroud)

如果我解决了IStartable我得到一个实例,如果我解决IConsumer<ConsoleCommand>我得到另一个.

如何为两个接口获取相同的实例?

c# singleton autofac

32
推荐指数
1
解决办法
1万
查看次数

垃圾收集器何时擦除使用Singleton模式的对象的实例?

垃圾收集器何时擦除使用Singleton模式的对象的实例?

对象是否比常规对象更长时间?

如何在Java中手动强制删除/垃圾回收?

谢谢.

java singleton garbage-collection design-patterns

32
推荐指数
3
解决办法
9900
查看次数

Python:将模块及其变量视为单例 - Clean方法?

我想在我的Python程序中实现某种单例模式.我想在不使用课程的情况下这样做; 也就是说,我想将所有与单例相关的函数和变量放在一个模块中,并将其视为一个实际的单例.

例如,假设这是在'singleton_module.py'文件中:

# singleton_module.py

# Singleton-related variables
foo = 'blah'
bar = 'stuff'

# Functions that process the above variables
def work(some_parameter):
    global foo, bar
    if some_parameter:
        bar = ...
    else:
        foo = ...
Run Code Online (Sandbox Code Playgroud)

然后,程序的其余部分(即其他模块)将使用此单例,如下所示:

# another_module.py

import singleton_module

# process the singleton variables,
# which changes them across the entire program
singleton_module.work(...)

# freely access the singleton variables
# (at least for reading)
print singleton_module.foo
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是个好主意,因为它在使用单例的模块中看起来很干净.

然而,单身模块中所有这些繁琐的"全局"陈述都是丑陋的.它们出现在处理单例相关变量的每个函数中.在这个特定的例子中,这并不多,但是当你有10个以上的变量来管理多个函数时,它并不漂亮.

此外,如果您忘记了全局语句,这很容易出错:将创建函数本地的变量,并且不会更改模块的变量,这不是您想要的!

那么,这会被认为是干净的吗?是否有类似于我的方法可以消除"全球"混乱?

或者这根本不是要走的路?

python singleton module

32
推荐指数
2
解决办法
2万
查看次数

如何创建单例类

在java中创建单例类的最佳/正确方法是什么?

我发现的一个实现是使用私有构造函数和getInstance()方法.

package singleton;

public class Singleton {

    private static Singleton me;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (me == null) {
            me = new Singleton();
        }

        return me;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在以下测试用例中实现失败了

package singleton;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {

    /**
     * @param args
     * @throws NoSuchMethodException
     * @throws SecurityException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws IllegalArgumentException
     */
    public static void main(String[] args) throws SecurityException,
            NoSuchMethodException, IllegalArgumentException,
            InstantiationException, IllegalAccessException, …
Run Code Online (Sandbox Code Playgroud)

java singleton design-patterns

31
推荐指数
1
解决办法
5万
查看次数