# Java 单例

> 原文： [https://www.programiz.com/java-programming/singleton](https://www.programiz.com/java-programming/singleton)

#### 在本教程中，我们将借助示例学习单例设计模式以及如何在 Java 中应用它。

单例是一种设计模式，而不是 Java 特有的功能。 它确保只创建一个类的实例。

设计模式就像我们的代码库一样，其中包含世界各地程序员共享的各种编码技术。

* * *

## Java 单例

这是我们如何在 Java 中使用单例。

*   创建`private`构造器，该构造器限制在类之外创建对象
*   创建一个引用单个对象的`private`属性。
*   创建一个`public static`方法，该方法允许我们创建和访问我们创建的对象。 在方法内部，我们将创建一个条件来限制我们创建多个对象。

这是一个例子。

```java
class SingletonExample {

// private field that refers to the object
   private static SingletonExample singleObject;

   private SingletonExample() {
      // constructor of the SingletonExample class
   }

   public static SingletonExample getInstance() {
      // write code that allows us to create only one object
      // access the object as per our need
   }
} 
```

在上面的示例中，

*   `private static SingletonExample singleObject` - 对类对象的引用。
*   `private SingletonExample()` - 私有构造器，用于限制在类外部创建对象。
*   `public static SingletonExample getInstance()` - 此方法返回对该类唯一对象的引用。 由于方法是`static`，因此可以使用类名进行访问。

* * *

## 使用单例类

使用数据库时可以使用单例。 它们可用于创建连接池以访问数据库，同时为所有客户端重用相同的连接。 例如，

```java
class Database {
   private static Database dbObject;

   private Database() {      
   }

   public static Database getInstance() {

      // create object if it's not already created
      if(dbObject == null) {
         dbObject = new Database();
      }

       // returns the singleton object
       return dbObject;
   }

   public void getConnection() {
       System.out.println("You are now connected to the database.");
   }
}

class Main {
   public static void main(String[] args) {
      Database db1;

      // refers to the only object of Database
      db1= Database.getInstance();

      db1.getConnection();
   }
} 
```

当我们运行程序时，输出将是：

```java
You are now connected to the database. 
```

在上面的示例中，

*   我们已经创建了一个单例类`Database`。
*   `dbObject`是一个类类型字段。 这将引用类`Database`的对象。
*   私有构造器`Database()`防止在类外部创建对象。
*   静态类类型方法`getInstance()`将类的实例返回到外部世界。
*   在`Main`类中，我们具有类类型变量`db1`。 我们正在使用`db1`调用`getInstance()`以获取`Database`的唯一对象。
*   只能使用`Database`的对象访问方法`getConnection()`。
*   由于`Database`只能有一个对象，因此所有客户端都可以通过单个连接访问数据库。

* * *

重要的是要注意，只有少数情况（如记录）使单例有意义。 甚至数据库连接通常也不应是单例。

如果您不确定是否使用单例，建议您完全避免使用单例。 了解更多： 单例有什么不好？](https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons "Why not to use singletons?")