【编程题】请设计一个类,该类在同一个进程中只能由一个实例,且该实例允许外部访问。
这里只针对Java语言来进行说明,题目“该类在同一个进程中只能由一个实例,且该实例允许外部访问”,那么很明显就是单例模式了,而单例模式有两种实现,懒汉模式和饿汉模式。
所谓饿汉模式我们可以理解,当前线程对这个实例对象的需求很“饿”,所以就要求我们在类加载好的时候就将初始化的对象赋值给static的属性(static修饰的属性在类被jvm加载的时候就在内存中创建一个存储空间)
public class test2_singleton_hungry { //声明一个静态实例化对象,在编译器就在内存中划分存储空间且设置为private,不能被外部访问 private static test2_singleton_hungry test2_singleton_hungry = new test2_singleton_hungry(); //私有构造方法 private test2_singleton_hungry(){ } //外部只能通过这个方法来获得实例,保证线程安全 public test2_singleton_hungry getInstance(){ return test2_singleton_hungry = new test2_singleton_hungry(); } }
public class test2_singleton_lazy { private static final String s = null; //私有构造函数,防止外部访问 private test2_singleton_lazy(){ } //声明静态实例对象,初始化为空 private static test2_singleton_lazy test2_singleton_lazy = null; //静态工厂调用时才赋值(用静态方法的好处:静态方法不能被重写) public static test2_singleton_lazy getInstance(){ if(test2_singleton_lazy==null){ test2_singleton_lazy= new test2_singleton_lazy(); } return test2_singleton_lazy; } }解决的方式有很多,可以加上synchronized同步锁,或者将初始化实例对象赋值语句用static代码块包起来,因为static代码块在类加载时候就执行且只会执行一次
class SingleInstance: __instance = None @classmethod def get_instance(cls): if cls.__instance is None: cls.__instance = SingleInstance() return cls.__instance if __name__ == '__main__': s1 = SingleInstance.get_instance() s2 = SingleInstance.get_instance() print(s1 == s2) print(id(s1)) print(id(s2))
public class singleton{ public static singleton instance=null; public singleton(){} public static singleton getinstance(){ if (instance==null){ instance=new singleton() } return instance } }