单例模式(Singleton) 2
Posted xhBruce
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式(Singleton) 2相关的知识,希望对你有一定的参考价值。
单例模式(Singleton) 2
Java
android 中 frameworks\\base\\core\\java\\android\\util\\Singleton.java
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.util;
import android.compat.annotation.UnsupportedAppUsage;
/**
* Singleton helper class for lazily initialization.
*
* Modeled after frameworks/base/include/utils/Singleton.h
*
* @hide
*/
public abstract class Singleton<T> {
@UnsupportedAppUsage
public Singleton() {
}
@UnsupportedAppUsage
private T mInstance;
protected abstract T create();
@UnsupportedAppUsage
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
用一下SingletonSampler
public class SingletonSampler {
private String mTag = "SingletonSampler";
private static final Singleton<SingletonSampler> mInstance = new Singleton<SingletonSampler>() {
@Override
protected SingletonSampler create() {
return new SingletonSampler();
}
};
public static SingletonSampler getInstance() {
return mInstance.get();
}
private SingletonSampler() {
}
public void setLog(String tag) {
mTag = tag;
}
@Override
public String toString() {
return getClass().getSimpleName() + "------" + mTag;
}
}
public class Main {
public static void main(String[] args) {
SingletonSampler sampler1 = SingletonSampler.getInstance();
SingletonSampler sampler2 = SingletonSampler.getInstance();
System.out.println(sampler2.toString());
sampler1.setLog("xhbruce");
System.out.println(sampler2.toString());
}
}
C/C++
Android 中 system\\core\\libutils\\include\\utils\\Singleton.h
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_UTILS_SINGLETON_H
#define ANDROID_UTILS_SINGLETON_H
#include <stdint.h>
// some vendor code assumes they have atoi() after including this file.
#include <stdlib.h>
#include <sys/types.h>
#include <utils/Mutex.h>
#include <cutils/compiler.h>
namespace android {
// ---------------------------------------------------------------------------
// Singleton<TYPE> may be used in multiple libraries, only one of which should
// define the static member variables using ANDROID_SINGLETON_STATIC_INSTANCE.
// Turn off -Wundefined-var-template so other users don't get:
// instantiation of variable 'android::Singleton<TYPE>::sLock' required here,
// but no definition is available
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundefined-var-template"
#endif
// DO NOT USE: Please use scoped static initialization. For instance:
// MyClass& getInstance() {
// static MyClass gInstance(...);
// return gInstance;
// }
template <typename TYPE>
class ANDROID_API Singleton
{
public:
static TYPE& getInstance() {
Mutex::Autolock _l(sLock);
TYPE* instance = sInstance;
if (instance == nullptr) {
instance = new TYPE();
sInstance = instance;
}
return *instance;
}
static bool hasInstance() {
Mutex::Autolock _l(sLock);
return sInstance != nullptr;
}
protected:
~Singleton() { }
Singleton() { }
private:
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
static Mutex sLock;
static TYPE* sInstance;
};
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
/*
* use ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) in your implementation file
* (eg: <TYPE>.cpp) to create the static instance of Singleton<>'s attributes,
* and avoid to have a copy of them in each compilation units Singleton<TYPE>
* is used.
* NOTE: we use a version of Mutex ctor that takes a parameter, because
* for some unknown reason using the default ctor doesn't emit the variable!
*/
#define ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) \\
template<> ::android::Mutex \\
(::android::Singleton< TYPE >::sLock)(::android::Mutex::PRIVATE); \\
template<> TYPE* ::android::Singleton< TYPE >::sInstance(nullptr); /* NOLINT */ \\
template class ::android::Singleton< TYPE >;
// ---------------------------------------------------------------------------
} // namespace android
#endif // ANDROID_UTILS_SINGLETON_H
用一下SingletonSampler
以上是关于单例模式(Singleton) 2的主要内容,如果未能解决你的问题,请参考以下文章