我有很多(抽象的)工厂,他们通常被实施为单身人士.
通常是为了方便不必将它们传递给真正与使用或了解这些工厂无关的层.
大多数时候我只需要在启动哪个工厂实现代码程序的其余部分时做出决定,也许可以通过一些配置
它看起来像是
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)?
如何在java中使用枚举的线程安全性?我正在使用枚举实现一个Singleton(根据Bloch的Effective Java),我应该担心我的单例枚举的线程安全性吗?有没有办法证明或证明它是线程安全的?
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我已经看到了Singleton模式的实现,其中实例变量在GetInstance方法中被声明为静态变量.像这样:
SomeBaseClass &SomeClass::GetInstance()
{
static SomeClass instance;
return instance;
}
Run Code Online (Sandbox Code Playgroud)
我认为这种方法有以下积极方面:
这种方法的不利方面是什么(除了这不是非常OOP-ish)?这是线程安全的吗?
静态对比 在SO中已经多次讨论过单身人士问题.
然而,所有的答案都指出了单身人士的许多优点.
我的问题是 - 静态类优于单例的优点是什么?为什么不每次只选择单身?
什么是设计可能抛出异常的单例类的最佳方法?
在这里,我有一个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)
再次感谢.
如果一个活动在实践中是一个单身人士,我想我可以通过宣布合适的成员"静态"来获得一些效率,风险为零.是?
我已经在网上阅读了很多帖子和文章,但我找不到明确的答案.
我有一些具有类似用途的功能,我想要超出全局范围.其中一些需要公开,另一些应该是私有的(因为它们只是"公共"功能的辅助功能).另外,我不仅有函数,还有变量.它们只需要"私人"帮助函数,也应该是私有的.
现在有三种方式:
对我采取什么方式?结合其中一些方法的可能方法?
我想到了类似的东西:
谢谢.
这就是我编写单例类的方法.
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)
单身模式存在以下挑战.
private或protected.MyAbstractSingletonClass.我在许多类上使用这种模式,并且总是必须编写相同的代码.我怎么能写出一些我需要单身时可以重复使用的东西?
我已经基于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) 我将全局变量存储在AppDelegate中并通过以下方式访问它们:
AppDelegate *d = [[UIApplication sharedApplication] delegate];
d.someString = ...
Run Code Online (Sandbox Code Playgroud)
什么是保存一些打字的推荐方法,所以我不需要AppDelegate *d = [[UIApplication sharedApplication] delegate];一次又一次?谢谢!