什么是单例模式(singleton)?

本文介绍了单例模式的概念及其在Java中的实现方式,并通过一个银行提款机的实例展示了如何确保资源的唯一性和同步访问。

设计模式,单元测试,重构是今天的程序员必须掌握的程序设计技术.

一、什么是单例模式?

     在我们的Java应用程序中,随着应用程序的运行会创建出很多对象。但有时候我们希望在创建某类对象时,无论创建多少次该类对象只有一份在内存中。这就是单例模式。如果我们要实现单例模式首先要保证构造函数私有化,即不允许用户随意调用我本类的构造函数,因为只要通过new操作创建对象,必定要在堆中开辟空间,这样就无法实现单例了。

二、单例模式的实现

public class Singleton{

     private static Singleton single=null;
     private Singleton(){}

     public static Singleton getSingleton(){

         if(single==null){

             single=new Singleton();
         }

         return single;
     }
}

设计模式的书都太厚了,看一遍都累个半死,所以我有了这个想法,用最简单的语言和最简单的代码来说明设计模式.

案例描述:

      街头 银行取款机一次只可以一个人,用一张卡站它前面提款.

程序:

/*
*    银行提款机 ATM          
*/
package com.singleton;
public class ATMCash {
private static ATMCash instance;
private String creditCard;

private ATMCash() {  
}

/**
    * 保证只有一个人一张卡在使用提款机
    */
public static synchronized ATMCash getInstance() {
    if (instance == null)
     instance = new ATMCash();
    return instance;
}

public String getMoney() {
    return creditCard;
}

//插入ATM磁卡
public void setCard(String card) {
    creditCard = card;
}

//取出ATM磁卡
public void getCard() {
    creditCard = null;
}

}

 

/*
* 提款
*/
package com.singleton;
public class Singleton {

public static void main(String[] args) {
  
    //------------下面是我的取款过程--------------
    ATMCash myCash = ATMCash.getInstance();    //来一个人取款
    myCash.setCard("我的银行卡");//插入磁卡
    System.out.println("我取钱用的是    :" +myCash.getMoney()); //取款
    //myCash.getCard(); //取回磁卡
  
  
    //------------下面是你取款过程----------------
    ATMCash yourCash = ATMCash.getInstance(); //来一个人取款
    System.out.println("你取钱用的是    :" + yourCash.getMoney()); //取款
}
}

<think> 我们正在讨论单例模式,用户询问单例实例对象的定义。根据引用内容,特别是引用[2]中描述的单例模式实现:构造方法私有化,定义一个静态对象,在静态代码块中new,实现单例模式。引用[1]和引用[3]也提供了单例模式的相关实现和删除方法。 单例模式的核心是确保一个类只有一个实例,并提供一个全局访问点。在Scala中,使用`object`关键字可以轻松创建单例对象。在Java/C++等语言中,则需要通过私有化构造函数、静态成员变量和静态工厂方法来实现。 因此,我们可以这样定义单例实例对象: **单例实例对象(Singleton Instance Object)**:指在程序运行期间,某个类只能被实例化一次,且该实例在整个程序中均可被访问的对象。它通过以下方式实现: 1. **私有化构造函数**:防止外部通过`new`创建多个实例。 2. **静态私有成员变量**:存储类的唯一实例。 3. **静态公共访问方法**:提供全局访问点,通常命名为`getInstance()`。 在Scala中,使用`object`关键字定义单例对象,编译器会自动生成符合单例模式的代码(如引用[2]所示)。 我们可以用Scala和Java两种代码进行说明: **Scala实现(使用`object`关键字)**: ```scala object Singleton { var count: Int = 0 def increment(): Unit = { count += 1 } def printCount(): Unit = println(count) } // 使用 Singleton.increment() Singleton.printCount() // 输出:1 ``` **Java实现**: ```java public class Singleton { private static Singleton instance = null; private int count = 0; // 私有构造函数 private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void increment() { count++; } public void printCount() { System.out.println(count); } } // 使用 Singleton.getInstance().increment(); Singleton.getInstance().printCount(); // 输出:1 ``` 单例模式的应用场景包括:配置管理、日志记录、数据库连接池等需要全局唯一实例的场合。 引用[3]提到单例对象的删除:通常情况下,程序结束时会自动析构单例对象。但有时需要手动控制,例如释放资源,这时可以提供一个静态的销毁方法(如`destroy_cluster`)。 根据用户提供的引用,我们还可以总结: - 引用[1]展示了Scala中一个简单的单例对象`findsum`,它包含变量和求和函数。 - 引用[2]解释了Scala伴生对象的单例实现机制。 - 引用[3]说明了如何手动删除单例对象。 因此,单例实例对象的定义可以概括为:**一个类仅有一个实例,且该实例由类自身创建,并提供全局访问点以避免重复创建。** 下面生成相关问题: 1. 单例模式在多线程环境下会出现什么问题?如何解决? 2. 单例模式与静态类的区别是什么? 3. 如何在Scala中实现带参数的单例对象? 4. 为什么单例模式需要私有化构造函数? 注意:引用标记要自然放在相关内容的后面。 </think> ### 单例实例对象的定义 **单例实例对象(Singleton Instance Object)** 指在程序运行期间,某个类只能被实例化**一次**,且该实例在整个程序生命周期内均可被访问的对象。其核心特征如下: 1. **唯一实例性** 通过**私有化构造函数**禁止外部通过`new`创建新对象,确保全局仅存在一个实例[^2]。 ```scala private def this() = ... // Scala私有构造方法 ``` 2. **全局访问点** 提供**静态访问方法**(如`getInstance()`)或**静态成员变量**作为唯一入口: ```scala object Singleton { // Scala的object即单例 def doSomething(): Unit = ... } ``` 3. **延迟初始化** 实例通常在首次访问时创建(懒加载),避免不必要的资源占用: ```java // Java/C++等语言的典型实现 if (instance == null) { instance = new Singleton(); // 首次调用时初始化[^2] } ``` 4. **生命周期管理** - 自动销毁:程序结束时由系统自动回收(如JVM/CLR)[^3] - 手动销毁:提供静态销毁方法(需考虑线程安全)[^3] ```cpp static void destroy() { if (instance != null) delete instance; // 手动删除 } ``` ### 单例模式的核心组件 | 组件 | 作用 | 实现示例 | |------|------|----------| | 私有构造函数 | 禁止外部实例化 | `private Singleton()` | | 静态实例变量 | 存储唯一实例 | `private static Singleton _instance` | | 静态访问方法 | 提供全局入口 | `def getInstance(): Singleton` | | 销毁方法(可选)| 手动释放资源 | `def destroy(): Unit`[^3] | ### 典型应用场景 1. 配置管理器(全局共享配置) 2. 日志记录器(统一写入日志) 3. 数据库连接池(复用资源) 4. 硬件设备控制(如打印机驱动) > **关键设计思想**:通过**控制实例化过程**取代**公开构造函数**,确保对象的全局唯一性[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值