标签: singleton

"辛格尔顿"工厂,好还是坏?

我有很多(抽象的)工厂,他们通常被实施为单身人士.

通常是为了方便不必将它们传递给真正与使用或了解这些工厂无关的层.

大多数时候我只需要在启动哪个工厂实现代码程序的其余部分时做出决定,也许可以通过一些配置

它看起来像是

abstract class ColumnCalculationFactory { 
  private static ColumnCalculationFactory factory;

 public static void SetFactory(ColumnCalculationFactory f) {
         factory = f;
  }

  public static void Factory() {
         return factory;
  }

 public IPercentCalculation CreatePercentCalculation();
 public IAverageCalculation CreateAverageCalculation();
    ....

}
Run Code Online (Sandbox Code Playgroud)

有些人闻到了这一点,我只是不确定是什么 - 它可能更像是一个被解雇的全球而不是单身人士.这并不是真的必须只有一个工厂创建ColumnCalculations - 虽然我的程序不需要更多.

这被认为是最佳实践吗?我应该在一些(半)全局AppContext类中填充它们吗?还有别的东西(我还没准备好切换到一些更大的IoC容器,还是转向一下spring.net)?

singleton factory

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

如何在java中使用枚举的线程安全性?

如何在java中使用枚举的线程安全性?我正在使用枚举实现一个Singleton(根据Bloch的Effective Java),我应该担心我的单例枚举的线程安全性吗?有没有办法证明或证明它是线程安全的?

// Enum singleton - the preferred approach
public enum Elvis { 
    INSTANCE;
    public void leaveTheBuilding() { ... }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

java singleton enums

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

Singleton实例声明为GetInstance方法的静态变量,它是否是线程安全的?

我已经看到了Singleton模式的实现,其中实例变量在GetInstance方法中被声明为静态变量.像这样:

SomeBaseClass &SomeClass::GetInstance()
{
   static SomeClass instance;
   return instance;
}
Run Code Online (Sandbox Code Playgroud)

我认为这种方法有以下积极方面:

  • 代码更简单,因为它的编译器只负责在第一次调用GetInstance时创建此对象.
  • 代码更安全,因为没有其他方法可以获取对实例的引用,但是使用GetInstance方法并没有其他方法来更改实例,而是在GetInstance方法中.

这种方法的不利方面是什么(除了这不是非常OOP-ish)?这是线程安全的吗?

c++ singleton design-patterns

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

为什么选择静态类而不是单例实现?

静态对比 在SO中已经多次讨论过单身人士问题.
然而,所有的答案都指出了单身人士的许多优点.
我的问题是 - 静态类优于单例的优点是什么?为什么不每次只选择单身?

.net c# singleton static

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

单身和异常

什么是设计可能抛出异常的单例类的最佳方法?

在这里,我有一个Singleton(使用Bill Pugh的方法,在Wiki for Singleton中记录).

    private static class SingletonObjectFactoryHolder{
    //1  
        private static final ObjectFactory INSTANCE = new ObjectFactory();
    }

    private ObjectFactory() throws Exception{
    //2
            //create the factory
    }


    public static ObjectFactory getInstance(){
    //3
        return SingletonObjectFactoryHolder.INSTANCE;
    }
Run Code Online (Sandbox Code Playgroud)

如果在2处抛出异常,我想将其传播给调用者.但是,我不能从第1行抛出异常.

那么,如果没有正确创建单例对象,我唯一的选择是返回一个空对象吗?

谢谢

PS我确实意识到如果它通过不同的类加载器加载或者如果反射性地加载,这个Singleton可能会破坏,但它对我的目的来说已经足够了.

// UPDATE

我很好奇,我可以不重新安排我的设计,如下所示抛出异常吗?

此外,我不需要任何同步(类加载器保证静态内部类只加载一次,并且仅在调用getInstance()时).因此,线程安全和懒惰实例化?

 private static class SingletonObjectFactoryHolder{
        //1  
           public static ObjectFactory getInstance() throws Exception{
         return new ObjectFactory();
           }
 }

 private ObjectFactory() throws Exception{
        //2
        //create the factory
 }


 public static ObjectFactory getInstance(){
        //3
    return SingletonObjectFactoryHolder.getInstance();
 }
Run Code Online (Sandbox Code Playgroud)

再次感谢.

java singleton exception

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

我可以通过在Android Activity中声明适当的成员"static"来获得一些效率

如果一个活动在实践中是一个单身人士,我想我可以通过宣布合适的成员"静态"来获得一些效率,风险为零.是?

singleton static android android-activity

30
推荐指数
1
解决办法
9953
查看次数

C++,静态与命名空间与单例

我已经在网上阅读了很多帖子和文章,但我找不到明确的答案.

我有一些具有类似用途的功能,我想要超出全局范围.其中一些需要公开,另一些应该是私有的(因为它们只是"公共"功能的辅助功能).另外,我不仅有函数,还有变量.它们只需要"私人"帮助函数,也应该是私有的.

现在有三种方式:

  • 创建一个静态的类(反对:潜在的"不能在没有对象的情况下调用成员函数" - 并不是所有东西都需要是静态的)
  • 制作单身类(反对:我需要对象)
  • 创建命名空间(没有私有关键字 - 为什么我要把它放在命名空间中呢?)

对我采取什么方式?结合其中一些方法的可能方法?

我想到了类似的东西:

  1. 制作单例,静态函数使用单例对象的辅助函数(这可能吗?我仍然在类中,但访问它的类型的对象)
  2. 在programm start调用的构造函数,初始化所有东西( - >确保静态可以从单例对象访问函数)
  3. 仅通过MyClass :: PublicStaticFunction()访​​问公共函数

谢谢.

c++ singleton static namespaces

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

如何抽象单例类?

这就是我编写单例类的方法.

public class MyClass
{
    /// <summary>
    /// Singleton
    /// </summary>
    private static MyClass instance;

    /// <summary>
    /// Singleton access.
    /// </summary>
    public static MyClass Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new MyClass();
            }
            return _instance;
        }
    }

    private MyClass() { .... }
}
Run Code Online (Sandbox Code Playgroud)

如何创建可重用的单例模式?

单身模式存在以下挑战.

  • 构造函数是privateprotected.
  • 基类无法实例化继承的类.所以你可以重用一个共同的摘要MyAbstractSingletonClass.
  • 它必须具有本地只读属性才能获取实例.

问题

我在许多类上使用这种模式,并且总是必须编写相同的代码.我怎么能写出一些我需要单身时可以重复使用的东西?

c# singleton design-patterns

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

我的单身人士可以被多次叫

我已经基于c ++ 11实现了单例。但是在某些情况下,可以多次调用构造函数。

该类将编译为静态lib,并由其他so lib(一个以上so lib)使用。并且该系统是多线程系统(在Android HAL级别运行)

/// .h文件:

class Logger
{
public:

    /// Return the singleton instance of Logger
    static Logger& GetInstance() {
        static Logger s_loggerSingleton;
        return s_loggerSingleton;
    }

private:

    /// Constructor
    Logger();
    /// Destructor
    ~Logger();
}
Run Code Online (Sandbox Code Playgroud)

/// .cpp文件

Logger::Logger()
{
   ALOGE("OfflineLogger create");
}

Logger::~Logger()
{

}
Run Code Online (Sandbox Code Playgroud)

应该创建一次,例如:

03-21 01:52:20.785   728  4522 E         : OfflineLogger create
Run Code Online (Sandbox Code Playgroud)

但是我可以看到它已经创建了不止一次

03-21 01:52:20.785   728  4522 E         : OfflineLogger create
03-21 01:52:20.863   728  2274 E         : OfflineLogger create
03-21 01:52:20.977   728  2273 E         : …
Run Code Online (Sandbox Code Playgroud)

c++ singleton android hal

30
推荐指数
1
解决办法
3788
查看次数

[[UIApplication sharedApplication]委托]的简写?

我将全局变量存储在AppDelegate中并通过以下方式访问它们:

AppDelegate *d = [[UIApplication sharedApplication] delegate];
d.someString = ...
Run Code Online (Sandbox Code Playgroud)

什么是保存一些打字的推荐方法,所以我不需要AppDelegate *d = [[UIApplication sharedApplication] delegate];一次又一次?谢谢!

iphone singleton delegates objective-c

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