📜  Java Singleton

📅  最后修改于: 2020-09-26 15:26:45             🧑  作者: Mango

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

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

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


Java Singleton

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

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

这是一个例子。

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 ,因此可以使用类名进行访问。

使用Singleton类

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

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();
   }
}

当我们运行程序时,输出将是:

You are now connected to the database.

在上面的示例中,

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

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

如果不确定是否使用单例,建议您完全避免使用单例。了解更多:Singleton有什么不好?