有没有办法在类中创建唯一的实例?
此时,我正在尝试只创建一个Random类的实例.有几次我需要用一粒种子.以后可以换种子吗?
我不确定,我猜这是一个单身人士.
更新:我需要的是只有一个Random类的实例.这个想法是使用相同种子的几次.但后来我需要改变种子,所以我不确定单身是否是最好的方法,因为我想改变种子意味着创建一个新的实例.
有谁知道为什么这个bean多次被实例化?我只想要它的一个实例,但每次控制器运行时,都会再次调用构造函数.
这是我的applicationContext.xml中的定义
<bean id="DiameterClient" class="com.rory.diameter.client.DiameterClient" scope="singleton" init-method="start">
<constructor-arg type="java.lang.String" index="0"><value>${pcca.host}</value></constructor-arg>
<constructor-arg index="1"><value>${pcca.port}</value></constructor-arg>
<constructor-arg index="2" value="com.openwave.djgx.message"/>
<constructor-arg index="3" value="com.openwave.djgx.avp"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
在我的控制器中这里是我正在使用它 - 我虽然这只会获得DiameterClient类的一个实例,但每次下面的代码运行时它都会调用它的构造函数 - 任何帮助都非常感激:
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
DiameterClient diameterClient = (DiameterClient)factory.getBean("DiameterClient");
diameterClient.send(aar);
Run Code Online (Sandbox Code Playgroud)
注意,DiameterClient不是我的类,我不想编辑它,只想每个应用程序有一个全局实例.另请注意,DiameterClient扩展了Thread - 不确定这是否重要.
我有一个单例类,实例化如下:
#import "FavoritesManager.h"
static FavoritesManager *sharedFavoritesManager = nil;
@implementation FavoritesManager
+ (id)sharedManager {
@synchronized(self) {
if (sharedFavoritesManager == nil) {
sharedFavoritesManager = [[self alloc] init];
}
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这会返回一个对象,但由于某种原因它只会响应类方法.如果我调用实例方法,我会得到
+[FavoritesManager testMethod]: unrecognized selector sent to class 0x59198
Run Code Online (Sandbox Code Playgroud)
对于它的价值,这就是testMethod的样子:
- (void)testMethod {
NSLog(@"Test");
}
Run Code Online (Sandbox Code Playgroud)
我绝对肯定它在界面中声明.我在其他类中使用了这个确切的代码,它就像一个魅力,所以我真的不明白这里的问题是什么.有一点可疑的是加号+[FavoritesManager testMethod],但我无法解释.有任何想法吗?
编辑:我混淆了公共/私人和类/方法术语.感谢所有指出这一点的人.
我正在尝试更多地设计模式,我正在构建一个快速测试,以帮助我进一步了解单例模式.然而,我在.net中遇到了一个让我感到困惑的错误,是什么让它更奇怪我无法复制错误,这只会增加我的困惑.下面的代码不是世界上最好的代码,但我随机测试的东西可以帮助我更深入地理解.
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(run1));
Thread t2 = new Thread(new ThreadStart(run2));
t1.Priority = ThreadPriority.Lowest;
t1.Start();
t2.Priority = ThreadPriority.Lowest;
t2.Start();
Console.ReadLine();
}
public static void run1()
{
Console.WriteLine("im in run1 \n");
TestSingleton._instance.PopulateCrudItemsProcess();
Thread.Sleep(1000);
Console.WriteLine(TestSingleton._instance.GetStrValue("first", 1000));
}
public static void run2()
{
Console.WriteLine("im in run2 \n");
TestSingleton._instance.PopulateCrudItemsProcess();
Console.WriteLine(TestSingleton._instance.GetStrValue("second", 500));
}
}
sealed class TestSingleton
{
private TestSingleton() { }
public static readonly TestSingleton _instance = new TestSingleton();
public string GetStrValue(string str, int …Run Code Online (Sandbox Code Playgroud) 有没有办法为HTML5 Web应用程序实现应用程序范围的内存缓存?
是否有HTML5功能可以拥有数据的内存缓存?我不是在讨论仅存储服务器响应的浏览器缓存.我需要缓存更有效的对象.
我能想到的一种可能性是实现一个全局单例JavaScript对象,该对象将在应用程序的生命周期内创建一次,以便它可以处理缓存和检索数据.如果这是唯一的方法,那么如何创建这样的单例对象呢?
我有两个单例,第一个标题看起来像这样(我省略了与Singleton模式无关的所有内容):
#ifndef TEXTUREMANAGER_DEFINED_H
#define TEXTUREMANAGER_DEFINED_H
class FontManager;
class TextureManager
{
private:
static TextureManager *instance;
TextureManager();
public:
FontManager *fontManager;
static TextureManager* Instance();
};
#endif
Run Code Online (Sandbox Code Playgroud)
在实现中,这是Instance()方法(以及实例静态成员的初始化):
#include "FontManager.h"
TextureManager * TextureManager::instance = 0;
TextureManager* TextureManager::Instance ()
{
if (instance==0)
instance=new TextureManager;
return instance;
}
Run Code Online (Sandbox Code Playgroud)
这是构造函数:
TextureManager::TextureManager()
{
fontManager=FontManager::Instance();
}
Run Code Online (Sandbox Code Playgroud)
第二个单例(FontManager)的设计完全相同,但不是FontManager指针有一个TextureManager指针,并且在它的构造函数中它使用TextureManager :: Instance()初始化该指针.这应该是这样的:TextureManager首先实例化(当程序启动时),并在其构造函数中第一次实例化FontManager单例调用FontManager :: Instance().FontManager,在它的构造函数中,使用TextureManager :: Instance()将其指针指定给TextureManager,此方法返回已存在的TextureManager实例.对?
但是代替那个程序进入无限循环,因为(我不知道为什么)Instance()方法总是创建一个新实例.我if (instance==0)总是评价为真.
您可以通过实现Singleton模式来创建类单例.如今单身人士课是基本要求.
为什么JVM在运行时不自行处理Singleton对象的创建?
通过像"Singleton"这样的标记接口,并在运行时由JVM创建一次对象实例.无论如何,如果Class没有扩展任何其他类,Java编译器会添加"extends Object".类似的方法可以应用于Singleton案例.这将节省大量的时间和开发工作以及围绕Singleton模式的各种实现的讨论.
1)同步的getInstance()
2)getInstance()内部的同步块,而不是使整个方法同步
3)选项2使用singleInstance作为volatile成员
如果你需要在多个类中实现单例模式(不考虑将返回已传递的任何类的单例实例的SingletonPatternFactory类),这也将节省大量时间和重复工作.
我有一个单例类,我设置了一个NSMutableDictionary被调用的completedLevels.
这是我设置的init方式(在我的单身人士的方法中):
NSString *mainPath = [[NSBundle mainBundle] bundlePath];
NSString *levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:@"levelconfig.plist"];
NSDictionary *levelConfig = [[NSDictionary alloc] initWithContentsOfFile:levelConfigPlistLocation];
completedLevels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levelSets = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *stats = [[NSMutableDictionary alloc]init];
[stats setObject:[NSNumber numberWithBool:NO] forKey:@"levelDone"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"stars"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"time"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"bestTime"];
for (int i = 1; i<=18; i++) {
[levels setObject:stats forKey:[NSString stringWithFormat:@"level%d", i]];
}
for(int i= 1; i<=15;i++){
NSString *lvlSet …Run Code Online (Sandbox Code Playgroud) 我有一些代码如下所示.我想这是Singleton模式.为什么我需要一个静态构造函数.这也有什么好处?感谢您的回复 ...
public sealed class Myclass
{
static Myclass()
{
Myclass.Application = new Myclass();
}
protected Myclass()
{
}
static Myclass _application;
public static Myclass Application
{
get { return Myclass._application; }
protected set { Myclass._application = value; }
}
string _name;
public string Name
{
get { return _name}
protected set { _name= value; }
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个(现在)是静态的类:
public static class Grob
{
public static void Frob()
{
Foo.Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
这很有效.代码电话:
Grob.Frob();
Run Code Online (Sandbox Code Playgroud)
一切都与世界是对的.现在我希望我的类实现一个接口:
public static class Grob : IOldNewGrob
{
public static void Frob()
{
Foo.Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为原因.
所以我会尝试更改为单个类:
public sealed class Grob
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Grob() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance …Run Code Online (Sandbox Code Playgroud) singleton ×10
c# ×4
.net ×2
java ×2
objective-c ×2
c++ ×1
caching ×1
html5 ×1
ios ×1
ipad ×1
iphone ×1
javascript ×1
random ×1
spring ×1
spring-mvc ×1
static-class ×1
web.xml ×1