创建只有一个实例的类


class Single_Instance{

public:
 Single_Instance * Get_Instance();
private:
 Single_Instance * pCur_Instance;
 int data;
 Single_Instance();
 Single_Instance(Single_Instance & copy);
 ~Single_Instance(); 
};

Single_Instance::Single_Instance()
{
 cout<<"new single!"<<endl;
}

Single_Instance::Single_Instance(Single_Instance & copy)
{
 cout<<"new single by copy!"<<endl;
}

Single_Instance::~Single_Instance()
{
 cout<<"destroy single!"<<endl;
}

Single_Instance * Single_Instance::Get_Instance()
{
 if(pCur_Instance==NULL)
  pCur_Instance = new Single_Instance;
 return pCur_Instance;
}

单例模式确保一个只有一个实例的原理主要基于对的构造器、实例访问方式和实例缓存的控制。通过将构造器私有化,外界无法随意创建的对象;提供一个公共的静态方法作为访问点,使得外界可以通过该方法获取实例;使用一个静态成员变量来缓存已经创建的对象,保证每次获取的都是同一个实例[^5]。 以下是几种常见的单例模式实现方法: #### 懒汉式(线程不安全) ```java package com.Singleton; class SingletonTwo { // 1、创建一个私有的构造方法 private SingletonTwo() { } // 2、创建一个实例化 private static SingletonTwo instance = null; // 3、创建一个向系统提供实例对象的方法,懒汉式,只有在使用的时候才会创建实例化 public static SingletonTwo getInstance() { if (instance == null) instance = new SingletonTwo(); return instance; } } ``` 在这种实现中,只有在第一次调用`getInstance`方法时才会实例化对象,但是在多线程环境下可能会创建多个实例,因为多个线程可能同时通过`if (instance == null)`的判断,从而创建多个对象,违背了单例模式的设计思想[^2]。 #### 懒汉式(线程安全) ```java package com.Singleton; class SingletonTwo { private SingletonTwo() { } private static SingletonTwo instance = null; public static synchronized SingletonTwo getInstance() { if (instance == null) instance = new SingletonTwo(); return instance; } } ``` 通过在`getInstance`方法上添加`synchronized`关键字,保证了在同一时刻只有一个线程可以进入该方法,从而避免了多线程环境下创建多个实例的问题。但这种方式会影响性能,因为每次调用`getInstance`方法都需要进行同步操作。 #### 饿汉式 ```java class SingletonDemo { private static SingletonDemo s = new SingletonDemo(); private SingletonDemo() {} public static SingletonDemo get() { return s; } } ``` 在加载时就创建实例对象,避免了多线程环境下的同步问题。但如果该实例对象在程序运行过程中可能不会被使用,会造成资源的浪费[^3]。 #### 双重检查锁定(Double-Checked Locking) ```java class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 这种方式结合了懒汉式和同步的优点,既保证了在需要时才创建实例,又避免了每次调用`getInstance`方法都进行同步操作,提高了性能。使用`volatile`关键字可以防止指令重排序,保证在多线程环境下的正确性。 #### 静态内部 ```java class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 利用了静态内部的特性,在外部加载时,静态内部不会被加载,只有在调用`getInstance`方法时,静态内部才会被加载并创建实例对象。这种方式既保证了线程安全,又实现了懒加载。 #### 枚举 ```java enum Singleton { INSTANCE; public void doSomething() { // 实现具体的业务逻辑 } } ``` 枚举是 Java 中最简洁、最安全的单例实现方式,它可以防止反序列化和反射攻击,保证一个只有一个实例
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值