JavaRush /Blog Java /Random-VI /Mẫu Singleton theo cách nói của bạn
Roman_kh
Mức độ
Харьков

Mẫu Singleton theo cách nói của bạn

Xuất bản trong nhóm

Xin chào mọi người, javaRush!

Hôm nay tôi sẽ kể cho bạn nghe về mẫu thiết kế Singleton(đơn). Mẫu Singleton theo cách nói của bạn - 1Mục tiêu: tạo một lớp chỉ có MỘT đối tượng. Điều này có nghĩa là bất kể nó được truy cập bao nhiêu lần, đối tượng tương tự được tạo lần đầu tiên sẽ được trả về. Đây là một điều tiện lợi và cần thiết ở nhiều nơi, không phải vô cớ mà nó được triển khai thành các framework. Ứng dụng:
  • Ví dụ: bạn cần kết nối cơ sở dữ liệu với một dự án và một lớp sẽ chịu trách nhiệm kết nối với nó. Kết nối được tạo một lần và không cần phải tạo đi tạo lại
  • Application settings— một lớp chịu trách nhiệm về các cài đặt kết nối cần thiết cho ứng dụng: máy chủ và cổng cơ sở dữ liệu, v.v. Chúng được tạo một lần và được sử dụng trong suốt quá trình hoạt động của ứng dụng.
  • Còn nhiều ví dụ nữa mà tôi chưa đề cập đến, vì vậy hãy viết ra lựa chọn của bạn trong phần bình luận! =)
Sau phần giới thiệu này, theo tôi hiểu, chúng ta có thể đưa ra một ví dụ về lớp này: (Mặc dù tôi chắc chắn rằng mỗi người trong chúng ta đều có thể nghĩ ra cách triển khai lớp này) Đây là ví dụ đơn giản nhất, khi chúng ta đặt hàm tạo ở chế độ riêng tư, tức là. Bạn không thể tạo một đối tượng một cách rõ ràng. Và có một phương thức tĩnh getInstance()cung cấp một đối tượng.
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Có vấn đề với đa luồng và sau đó bạn có thể đặt phương thức getInstance()đánh dấu synchronized:
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Cuối cùng, như thường lệ, tôi muốn nói rằng nếu bạn nghĩ khác hoặc phát hiện ra sai sót ở tôi, hãy viết bình luận! Chúng ta sẽ thảo luận mọi thứ một cách vui vẻ :) Nếu bạn thích bài viết, hãy viết “+” và tôi sẽ biết điều đó. Điều này quan trọng đối với tôi :) PS Tôi đang bổ sung thêm nhiều cách triển khai khác: Theo Joshua Bloch , đây là cách tốt nhất để triển khai mẫuEnum Singleton
public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
        private static volatile Singleton instance;

        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
Và xa hơn On Demand Holder idiom:
public class Singleton {

   public static class SingletonHolder {
      public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+Khởi tạo lười biếng +Hiệu suất cao -Không thể sử dụng cho các trường lớp không tĩnh Mọi câu hỏi/đề xuất - hãy viết trong phần bình luận! Xem thêm các bài viết khác của tôi:
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION