python单例类命名_单例模式(java/python/c++)
序
最近接觸到新項目,后端基于java開發。對于有c++/python開發經驗,無java經驗的小梅同學,開始了漫漫學習之旅,第一篇學習記錄,從最簡單的單例模式開始吧。
眾所周知,單例模式的最明顯的幾個特點:
一個進程存在唯一一個實例
不能被用戶創建
有一個獲取實例的接口
單例模式常用在日志,全局變量等整個進程只需要唯一實例的應用中。
開啟java之旅
Step1:new->Package 命名為singleton
Step2:在singleton包下,new->Java Class,命名為Singleton。Singleton.java實現如下:
package singleton;
public class Singleton
{
// 定義一個私有靜態的句柄
private static Singleton instance = null;
// 構造函數私有化:保證1,2
private Singleton(){}
// 公有靜態獲取句柄函數:保證3
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
// 其他普通函數
public void testCommFunc()
{
System.out.println("Common Function Of Singleton Class");
}
};
Step3:在singleton包下,new->Java Class,命名為SingletonDemo。SingletonDemo.java實現如下:
package singleton;public class SingletonDemo
{
public static void main(String[] args)
{
Singleton s = Singleton.getInstance();
s.testCommFunc();
}
}
Step4: 運行SingletonDemo.java,控制臺輸出:
Common Function Of Singleton Class
回顧
Python中單例
最簡單的方式:在file1.py定義中定義一個變量var,其他文件導入這個變量,此變量即是全局的。如果此變量為類實例變量,那么此實例即是唯一的。
單例class方式:
# 單例實現
class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
# with Singleton.lock: #如果是多線程的話,此處需要加鎖
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
# ClassA(比如日志類)繼承單例
class MyLog(metaclass=Singleton):
def __init__(self):
super(ClassA, self).__init__()
self.x = None
self.y = dict()
a1 = MyLog()
a1.x = 10
a2 = MyLog()
a2.y = [1, 1, 2]
# a1和a2的輸出地址應相同
print("addr a1 {} a2 {}".format(a1, a2))
# a1和a2的x,y值應相同,分別為10, [1, 1, 2]
print("x: a1 {}, a2 {}".format(a1.x, a2.x))
print("y: a1 {}, a2 {}".format(a1.y, a2.y))
c++中的單例
template
class TSingleton
{
public:
static T* getInstance();
protected:
TSingleton(const TSingleton&) {}
TSingleton&operator=(const TSingleton&) {}
TSingleton() {}
virtual ~TSingleton() {}
static std::shared_ptr&instance()
{
// 采用std標準庫中的輕量級智能指針實現單件對象管理
static std::shared_ptr pInstance;
return pInstance;
}
};
template
T*TSingleton::getInstance()
{
std::shared_ptr &rInstance = instance();
// Double-checked
if (NULL == rInstance.get())
{
if (NULL == rInstance.get())
{
// 不使用instance().reset(new T),防止在編譯器優化的情況下
// 出現先將智能指針賦值,再進行構造
std::shared_ptr _au(new T);
rInstance = _au;
}
}
return rInstance.get();
}
日志類:
class CMyLog : public TSingleton
{
....
}
總結
以上是生活随笔為你收集整理的python单例类命名_单例模式(java/python/c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql物流管理系统_wuliuwan
- 下一篇: flex 会使div撑满_如何讲清楚Fl