/*
* 与Python的静态单例比较:
* 一样是需要加上static方法才可以直接调用类里面的私有方法
*
* Python的类方法上 加上装饰器@staticmethod就可以不用实例化类而直接调用里面的方法
*
* */
public class SingleTon {
public static void main(String[] args) {
// 3 创建出两个对象
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
// 4 内存地址是否是一样的
System.out.println(bank1 == bank2);
// 3 创建出两个对象
Bank2 bank3 = Bank2.getInstance_l();
Bank2 bank4 = Bank2.getInstance_l();
// 4 内存地址是否是一样的
System.out.println(bank3 == bank4);
}
}
// A设计模式
class Bank{
// 0 创建一个私有方法 只能在本类里面调用
private Bank(){
}
// 1 创建一个类 Instance 实例化后的定义名
private static Bank Instance = new Bank();
// 2 上面两个private 方法不能调用 所以要创建一个公共方法来 返回对象
public static Bank getInstance() {
return Instance;
}
}
B设计模式
// 这个类似于Python的 也是判断是否实例化过对象
class Bank2{
// 0 创建一个私有方法 只能在本类里面调用
private Bank2(){
}
// 1 创建一个类 定义为null 用于判断是否实例化过
private static Bank2 Instance2 = null;
// 2 如果实例化过就直接返回 没有创建过就实例化
public static Bank2 getInstance_l() {
if(Instance2 == null){
Instance2 = new Bank2();
}
return Instance2;
}
}
Python代码:
@staticmathod
class Dome(object):
# 这里也是先定义私有方法为None
__message = None
# 如果实例化过就直接返回 没有创建过就实例化
def __new__(cls, *args, **kwargs):
if cls.__message == None:
cls.__message = object.__new__(cls)
return cls.__message
应用场景:
1:网站的计数器,一般也是单例模式实现,否则难以同步。
2:应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
3:项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。
4:Application也是单例的典型应用
5:Windows的Task Manager(任务管理器)就是很典型的单例模式
6:Windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。