标签: singleton

单身人士有什么不好的?

单例模式是一个缴足成员四人帮模式书,但最近似乎而是由开发者世界孤立.我仍然使用相当多的单例,特别是对于工厂类,虽然你必须对多线程问题(实际上是任何类)有点小心,但我不明白为什么它们如此可怕.

Stack Overflow特别假设每个人都同意Singletons是邪恶的.为什么?

请用" 事实,参考或特定专业知识 " 支持您的答案

singleton design-patterns

1931
推荐指数
30
解决办法
48万
查看次数

静态类和单例模式之间的区别?

静态类和单例模式之间存在什么真实(即实际)差异?

两者都可以在没有实例化的情况下调用,两者都只提供一个"实例",它们都不是线程安全的.还有其他区别吗?

singleton static design-patterns

1708
推荐指数
21
解决办法
48万
查看次数

836
推荐指数
4
解决办法
14万
查看次数

在Python中创建单例

这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".

我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.

最好的方法:


方法1:装饰者

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class MyClass(BaseClass):
    pass
Run Code Online (Sandbox Code Playgroud)

优点

  • 装饰器的添加方式通常比多重继承更直观.

缺点

  • 虽然使用MyClass()创建的对象将是真正的单例对象,但MyClass本身是一个函数,而不是一个类,因此您无法从中调用类方法.也是为了m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != o

方法2:基类

class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass(Singleton, …
Run Code Online (Sandbox Code Playgroud)

python singleton metaclass decorator base-class

829
推荐指数
14
解决办法
29万
查看次数

793
推荐指数
17
解决办法
30万
查看次数

C++ Singleton设计模式

最近我碰到了C++的Singleton设计模式的实现/实现.看起来像这样(我从现实生活中采用了它):

// a lot of methods are omitted here
class Singleton
{
   public:
       static Singleton* getInstance( );
       ~Singleton( );
   private:
       Singleton( );
       static Singleton* instance;
};
Run Code Online (Sandbox Code Playgroud)

从这个声明我可以推断出实例字段是在堆上启动的.这意味着存在内存分配.对我来说完全不清楚的是,什么时候内存将被解除分配?还是有漏洞和内存泄漏?好像在实施中存在问题.

我的主要问题是,如何以正确的方式实施它?

c++ singleton design-patterns

692
推荐指数
11
解决办法
65万
查看次数

如何在Android中声明全局变量?

我正在创建一个需要登录的应用程序.我创建了主要和登录活动.

在主要活动onCreate方法中,我添加了以下条件:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    loadSettings();
    if(strSessionString == null)
    {
        login();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

onActivityResult登录表单终止时执行的方法如下所示:

@Override
public void onActivityResult(int requestCode,
                             int resultCode,
                             Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case(SHOW_SUBACTICITY_LOGIN):
        {
            if(resultCode == Activity.RESULT_OK)
            {

                strSessionString = data.getStringExtra(Login.SESSIONSTRING);
                connectionAvailable = true;
                strUsername = data.getStringExtra(Login.USERNAME);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是登录表单有时会出现两次(login()方法被调用两次),当手机键盘滑动时,再次出现登录表单,我猜问题是变量strSessionString.

有没有人知道如何设置变量global以避免在用户已经成功验证后出现登录表单?

singleton android state global-variables

592
推荐指数
7
解决办法
30万
查看次数

在Swift中使用dispatch_once单例模型

我正在尝试找出适合在Swift中使用的单例模型.到目前为止,我已经能够得到一个非线程安全模型:

class var sharedInstance: TPScopeManager {
    get {
        struct Static {
            static var instance: TPScopeManager? = nil
        }

        if !Static.instance {
            Static.instance = TPScopeManager()
        }

        return Static.instance!
    }
}
Run Code Online (Sandbox Code Playgroud)

在Static结构中包装单例实例应允许单个实例在没有复杂命名方案的情况下不与单例实例发生冲突,并且它应该使事情变得相当私密.显然,这个模型不是线程安全的,所以我尝试将dispatch_once添加到整个事情中:

class var sharedInstance: TPScopeManager {
    get {
        struct Static {
            static var instance: TPScopeManager? = nil
            static var token: dispatch_once_t = 0
        }

        dispatch_once(Static.token) { Static.instance = TPScopeManager() }

        return Static.instance!
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个编译器错误dispatch_once:

无法将表达式的类型'Void'转换为'()'类型

我已经尝试了几种不同的语法变体,但它们似乎都有相同的结果:

dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Run Code Online (Sandbox Code Playgroud)

dispatch_once使用Swift 的正确用法是什么?我最初认为问题出在块中,因为dispatch_once错误消息,但我看的越多,我认为可能是获得() …

singleton dispatch swift

563
推荐指数
10
解决办法
13万
查看次数

是否有一种简单,优雅的方式来定义单身人士?

似乎有很多方法可以在Python中定义单例.Stack Overflow是否有共识?

python singleton design-patterns

427
推荐指数
13
解决办法
27万
查看次数

关于设计模式:我什么时候应该使用单身人士?

荣耀的全球变量 - 成为一个荣耀的全球阶级.有人说打破面向对象的设计.

给我一些场景,除了好的旧记录器,使用单例是有意义的.

singleton design-patterns

421
推荐指数
14
解决办法
21万
查看次数