首页 > 试题广场 >

【编程题】请设计一个类,该类在同一个进程中只能由一个实例,且

[问答题]

【编程题】请设计一个类,该类在同一个进程中只能由一个实例,且该实例允许外部访问。

这里只针对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(); } } 

而懒汉模式就是我们理解的“lazy_load”,延迟加载,初始化的时候为空,只有用到这个对象的时候才会进行加载,但是如果不做处理的话在多线程情况下会有线程安全问题
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代码块在类加载时候就执行且只会执行一次











发表于 2018-11-30 16:45:42 回复(0)
设计模式的单例
public class singleton{
            //声明一个静态变量
            private static singleton instance;
            //构造器
            private singleton(){
            }
            //getter方法
            public static singleton getInstance(){
                  if(instance==null){
                    instance=new singleton();
                   }
                return instance;
            }
}

发表于 2018-11-01 10:34:12 回复(0)
Lazy model:
public class Singleton{
private static Singleton instance;
private singleton(){}
public static Singleton getInstance (){
if(instance==null){
instance=new Singleton();
}
return instance;
}

}
发表于 2018-10-29 14:05:53 回复(0)
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def show_info(self):
        print('%s的年龄是%d岁'%(self.name,self.age))

发表于 2020-07-08 17:01:49 回复(0)
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))


编辑于 2021-04-26 23:53:51 回复(0)
public class Singleton{
      private Singleton instance;
    private Singleton(){}

    public static Singleton getInstance(){
        if( instance == null ){
            synchronized(Singleton.class){
                if(instance == null ){
                    instance = new SingleClass();
                }
            }
        }
        return instance;
    }


}

发表于 2021-03-11 17:27:14 回复(0)
public class singleton{
    public static singleton instance=null;
    public singleton(){}
    public static singleton getinstance(){
        if (instance==null){
            instance=new singleton()
        }
        return instance
    }
}

发表于 2019-10-19 20:47:36 回复(0)
class CSingleton{
   private:
       CSingleton(){ }
  public:
    static CSingleton * GetInstance(){
       static CSingleton * m_pInstance;
       if(m_pInstance == nullptr)
           m_pInstance = new CSingleton();
        return m_pInstance;
}

发表于 2018-08-02 11:08:49 回复(1)