有没有办法在C++中实现单例对象:
(我不太了解我的C++,但是在执行任何代码之前初始化积分和常量静态变量的情况(即,甚至在执行静态构造函数之前 - 它们的值可能已在程序中"初始化")如果是这样的话 - 也许这可以被利用来实现单例互斥体 - 这反过来可以用来保护真正的单例的创建......)
很好,现在我似乎有几个好的答案(羞耻我不能标记2或3作为答案).似乎有两个广泛的解决方案:
c++ singleton construction multithreading lazy-initialization
对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.
只是想确保我在这里假设一些愚蠢的东西,在ASP .Net Web应用程序中实现单例模式时,静态变量作用域仅适用于当前用户会话,对吧?如果第二个用户正在访问该站点,那么它是一个不同的内存范围......?
public interface IInterface1
{
}
public interface IInterface2
{
}
public class MyClass : IInterface1, IInterface2
{
}
...
ObjectFactory.Initialize(x =>
{
x.For<IInterface1>().Singleton().Use<MyClass>();
x.For<IInterface2>().Singleton().Use<MyClass>();
});
var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();
Run Code Online (Sandbox Code Playgroud)
我用上面的代码得到了两个不同的MyClass实例.我该怎么办?
正如标题所提到的,我的问题很明显,我详细描述了这个场景.在文件singleton.h中有一个名为singleton的类,由singleton模式实现,如下所示:
/*
* singleton.h
*
* Created on: 2011-12-24
* Author: bourneli
*/
#ifndef SINGLETON_H_
#define SINGLETON_H_
class singleton
{
private:
singleton() {num = -1;}
static singleton* pInstance;
public:
static singleton& instance()
{
if (NULL == pInstance)
{
pInstance = new singleton();
}
return *pInstance;
}
public:
int num;
};
singleton* singleton::pInstance = NULL;
#endif /* SINGLETON_H_ */
Run Code Online (Sandbox Code Playgroud)
然后,有一个名为hello.cpp的插件如下:
#include <iostream>
#include "singleton.h"
extern "C" void hello() {
std::cout << "singleton.num in hello.so : " << singleton::instance().num << std::endl;
++singleton::instance().num; …Run Code Online (Sandbox Code Playgroud) 我正在查看的当前代码库使用DOM解析器.以下代码片段在5种方法中重复:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Run Code Online (Sandbox Code Playgroud)
如果在循环中调用包含上述代码的方法,或者在应用程序中多次调用该方法,那么我们将承担为每次调用此类方法创建新的DocumentBuilderFactory实例和新的DocumentBuilder实例的开销.
在DocumentBuilder工厂和DocumentBuilder实例周围创建一个单独的包装器是一个好主意,如下所示:
public final class DOMParser {
private DocumentBuilderFactory = new DocumentBuilderFactory();
private DocumentBuilder builder;
private static DOMParser instance = new DOMParser();
private DOMParser() {
builder = factory.newDocumentBuilder();
}
public Document parse(InputSource xml) {
return builder.parser(xml);
}
}
Run Code Online (Sandbox Code Playgroud)
如果上述单例在多个线程之间共享,是否会出现任何问题?如果没有,通过在应用程序的整个生命周期中使用上述创建DocumentBuilderFactory和DocumentBuilder实例的方法,是否会有任何性能提升?
编辑:
我们唯一能遇到问题的是,如果DocumentBuilder在解析可能影响解析下一个XML文件的XML文件时保存了一些状态信息.
这是我到目前为止实现的代码,用于创建单个实例WPF应用程序:
#region Using Directives
using System;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Windows;
using System.Windows.Interop;
#endregion
namespace MyWPF
{
public partial class MainApplication : Application, IDisposable
{
#region Members
private Int32 m_Message;
private Mutex m_Mutex;
#endregion
#region Methods: Functions
private IntPtr HandleMessages(IntPtr handle, Int32 message, IntPtr wParameter, IntPtr lParameter, ref Boolean handled)
{
if (message == m_Message)
{
if (MainWindow.WindowState == WindowState.Minimized)
MainWindow.WindowState = WindowState.Normal;
Boolean topmost = MainWindow.Topmost;
MainWindow.Topmost = true;
MainWindow.Topmost = topmost;
}
return IntPtr.Zero;
} …Run Code Online (Sandbox Code Playgroud) 我得到的编码是,你基本上提供了一个"对象SomeClass"和一个"类SomeClass",伴侣类是类声明,对象是一个单例.其中您无法创建实例.所以...我的问题主要是在这个特定实例中单个对象的目的.
这基本上只是一种在Scala中提供类方法的方法吗?像Objective-C中的+基础方法一样?
我正在阅读Scala编程书和第4章刚刚谈到的单例对象,但它没有详细说明为什么这很重要.
我意识到我可能会在这里超越自己,以后可能会对此进行更详细的解释.如果是这样,请告诉我.到目前为止,这本书相当不错,但它有很多"Java,你这样做",但我的Java经验很少,我有点想念我的一点点.我不希望这是其中一种情况.
我不记得在Scala网站上的任何地方阅读Java是阅读本书的先决条件......
我知道在Java中,我们可以通过创建一个类的实例new,clone(),Reflection和serializing and de-serializing.
我创建了一个实现Singleton的简单类.
我需要一直停止创建我的类的实例.
public class Singleton implements Serializable{
private static final long serialVersionUID = 3119105548371608200L;
private static final Singleton singleton = new Singleton();
private Singleton() { }
public static Singleton getInstance(){
return singleton;
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("Cloning of this class is not allowed");
}
protected Object readResolve() {
return singleton;
}
//-----> This is my implementation to stop it but Its not working. …Run Code Online (Sandbox Code Playgroud) 在我的android项目中,我有ImageAdapter类,我在其中传递应用程序上下文以满足其他需求.
public class ImageAdapter extends BaseAdapter {
private Context c;
public ImageAdapter(Context c) {
this.c = c;
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是我想让ImageAdapter成为一个单例,以便从我的所有活动中轻松访问这个类的实例.但是我不知道如何将getApplicationContext()方法中的app context从我的一个活动传递给ImageAdapter.所以有没有"神奇"做到这一点如下?
public class ImageAdapter extends BaseAdapter {
private Context c;
private static class Holder {
public static final ImageAdapter IA = new ImageAdapter();
}
private ImageAdapter() {
this.c = /* some magic here */.getApplicationContext();
}
public static ImageAdapter getInstance() {
return Holder.IA;
}
...
}
Run Code Online (Sandbox Code Playgroud)
也许你有一些其他的想法,可以为我的任何活动分享ImageAdapter.我是android的新手,我对在活动中传递数据的方式有点困惑.
我将不胜感激任何帮助.
singleton ×10
c# ×3
java ×3
c++ ×2
android ×1
asp.net ×1
baseadapter ×1
construction ×1
dlopen ×1
dom ×1
mutex ×1
performance ×1
reflection ×1
scala ×1
static ×1
structuremap ×1
wpf ×1