原文: https://www.programiz.com/java-programming/singleton

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

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

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


Java 单例

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

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

这是一个例子。

  1. class SingletonExample {
  2. // private field that refers to the object
  3. private static SingletonExample singleObject;
  4. private SingletonExample() {
  5. // constructor of the SingletonExample class
  6. }
  7. public static SingletonExample getInstance() {
  8. // write code that allows us to create only one object
  9. // access the object as per our need
  10. }
  11. }

在上面的示例中,

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

使用单例类

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

  1. class Database {
  2. private static Database dbObject;
  3. private Database() {
  4. }
  5. public static Database getInstance() {
  6. // create object if it's not already created
  7. if(dbObject == null) {
  8. dbObject = new Database();
  9. }
  10. // returns the singleton object
  11. return dbObject;
  12. }
  13. public void getConnection() {
  14. System.out.println("You are now connected to the database.");
  15. }
  16. }
  17. class Main {
  18. public static void main(String[] args) {
  19. Database db1;
  20. // refers to the only object of Database
  21. db1= Database.getInstance();
  22. db1.getConnection();
  23. }
  24. }

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

  1. 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?”)