2010-09-15 80 views
23

Bản sao có thể xảy ra:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?Sự khác biệt giữa lớp singleton và lớp tĩnh?

HI tôi không nhận rõ sự khác biệt giữa một lớp singleton và một lớp tĩnh là gì? Ai cũng có thể giải thích điều này bằng ví dụ?

+5

Âm thanh giống như một bản sao của http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern – oksayt

+1

Đừng quên đánh dấu câu trả lời là được chấp nhận nếu bạn có thông tin mình muốn .. –

+0

kiểm tra http://stackoverflow.com/a/37114702/1406510 – nanosoft

Trả lời

4

Đó là sự khác biệt giữa mẫu và cách mẫu được triển khai.

Mẫu Singleton không được gắn đặc biệt với ngôn ngữ Java. Có thể có nhiều cách khác nhau để tạo một lớp thành một singleton, tùy thuộc vào ngôn ngữ bạn sử dụng. Nhiều ngôn ngữ OO sử dụng các biến tĩnh tương đương để tạo ra một singleton, nhưng các ngôn ngữ khác có thể sử dụng các kỹ thuật khác nhau.

Ngoài ra, một số cách triển khai thực đơn đơn giản hơn những người khác. Một cách tốt để thực hiện một Singleton là để đóng gói đúng cách truy cập vào đó Singleton thông qua một phương pháp nhà máy:

public class Example { 
    private static final Example SINGLETON = new Example(); 

    public Example getInstance() { return SINGLETON; } 

    private Example() { /* Constructor */ } 
} 

Sử dụng kỹ thuật này, bạn có thể làm tất cả mọi thứ phức tạp: lười biếng-nạp singleton, thay thế nó với một số phân lớp, quản lý việc khởi tạo đơn thông qua cấu hình, v.v.

+2

Nếu phương thức 'getInstance()' của bạn không phải là 'static', thì người dùng tiềm năng có thể lấy một thể hiện của lớp này như thế nào nếu họ cần có một trường hợp để nhận được một? – winklerrr

1

A Singleton không phải là loại của lớp học mà là mẫu thiết kế. Với Singleton bạn (cố gắng) đảm bảo, chỉ có một cá thể của một lớp nhất định được xây dựng bên trong một Máy ảo Java đơn lẻ. Thực hiện hiện đại của các mô hình singleton sử dụng enums, bằng cách này. Các triển khai cũ hơn sử dụng một hàm tạo riêng và lưu trữ tham chiếu tới cá thể đơn lẻ trong một trường tĩnh.

A lớp tĩnh luôn là lớp thành viên, ngược lại với lớp bên trong, không có quyền truy cập vào biến mẫu của lớp xung quanh.


tĩnh lớp dụ

public class A { 
    public static class B {   
    }  
    public  int notAccessibleForB; 
    public static int accessibleForB; 
} 

Singleton pattern (đơn giản theo phong cách cũ)

public final class Singleton { 
    public final static Singleton INSTANCE = new Singleton(); 
    private Singleton(){} 
} 

Singleton pattern (đơn giản theo phong cách hiện đại)

public enum Singleton { 
    INSTANCE; 
} 
16

Cũ que/ans trên SO: Difference between static class and singleton pattern?

Một lớp tĩnh là một trong đó chỉ có phương pháp tĩnh, mà một từ tốt hơn sẽ là "chức năng". Phong cách thiết kế thể hiện trong một lớp tĩnh hoàn toàn là thủ tục.

Singleton, mặt khác, là một mẫu dành riêng cho thiết kế OO.Nó là một thể hiện của một đối tượng (với tất cả các khả năng vốn có trong đó, chẳng hạn như đa hình), với một quy trình tạo để đảm bảo rằng chỉ có một ví dụ của vai trò cụ thể đó trong toàn bộ vòng đời của nó.

16

Singleton Class: Singleton Class là lớp trong đó chỉ có một cá thể duy nhất có thể tồn tại trên mỗi trình nạp lớp.

Lớp trợ giúp/tĩnh (Loại chỉ với các trường/phương thức tĩnh): Không có trường hợp nào của lớp này tồn tại. Chỉ các trường và phương thức có thể được truy cập trực tiếp dưới dạng hằng số hoặc phương thức trợ giúp.

Sau đây được tham chiếu từ điều này blog "Static classes in Java" mô tả nó độc đáo. Blog cũng có các ví dụ để giải thích giống nhau:

Singleton dụ:

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 

    private ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 

    public static ClassicSingleton getInstance() { 
     if (instance == null) { 
      instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

tĩnh Lớp dụ:

/** 
* A helper class with useful static utility functions. 
*/ 
public final class ActionHelper { 

    /** 
    * private constructor to stop people instantiating it. 
    */ 
    private ActionHelper() { 
     // this is never run 
    } 

    /** 
    * prints hello world and then the users name 
    * 
    * @param users 
    *   name 
    */ 
    public static void printHelloWorld(final String name) { 
     System.out.println("Hello World its " + name); 
    } 

} 

Vì vậy, sự khác biệt giữa hai ví dụ là gì và tại sao tôi nghĩ rằng giải pháp thứ hai là tốt hơn cho một lớp học bạn không muốn hoặc cần phải nhanh chóng. Thứ nhất, mẫu Singleton rất hữu ích nếu bạn muốn tạo một thể hiện của một lớp. Đối với lớp trợ giúp của tôi, chúng tôi không thực sự muốn tạo ra bất kỳ bản sao nào của lớp. Lý do tại sao bạn không nên sử dụng một lớp Singleton là bởi vì đối với lớp helper này, chúng tôi không sử dụng bất kỳ biến nào. Lớp singleton sẽ hữu ích nếu nó chứa một tập các biến mà chúng ta chỉ muốn một bộ và các phương thức sử dụng các biến đó nhưng trong lớp trợ giúp của chúng ta, chúng ta không sử dụng bất kỳ biến nào ngoài các biến được truyền vào. . Vì lý do này, tôi không tin rằng chúng tôi muốn có một Instleton Instance bởi vì chúng tôi không muốn có bất kỳ biến nào và chúng tôi không muốn bất cứ ai tranh luận về lớp học này. Vì vậy, nếu bạn không muốn bất cứ ai instantiating lớp, đó là bình thường nếu bạn có một số loại helper/utils lớp sau đó tôi sử dụng những gì tôi gọi là lớp tĩnh, một lớp học với một constructor tư nhân và chỉ bao gồm các phương pháp tĩnh mà không có bất kỳ bất kỳ biến nào.

Cùng câu trả lời cũng được tham chiếu từ câu trả lời của tôi here

+0

Java phản ánh vẫn có thể được sử dụng để phá vỡ bất biến của không có trường hợp cho "lớp tĩnh". Một [giải pháp enum] (http://shamsmi.blogspot.com/2013/05/emptytons-mimicking-static-classes-in.html) sẽ vẫn bảo toàn được bất biến. – shams

+0

Và lý do tại sao để đánh bại instantiation? Điều gì sẽ xảy ra nếu bạn cần các đối số hàm tạo để tuân theo một logic và vẫn giữ nguyên phần còn lại tĩnh. –

+0

Trong ví dụ đơn, getInstance không phải là chủ đề an toàn, cần được đồng bộ hóa. – kecso

5

Sự khác biệt không phải là cách chính xác để ask.because singleton được không phải là một từ khóa so với tĩnh. bạn nên hỏi "Khi nào nên chọn cái nào?" những lợi thế của lớp singleton trên lớp tĩnh, những câu hỏi này đến ở giai đoạn thiết kế là gì.

Singleton: Cách sử dụng: các lớp dùng làm cấu hình chung, ví dụ: Phiên bản dùng thử của phần mềm có một kết nối cơ sở dữ liệu, JDK Runtime classes instances per jvm.

Khi cần đi: 1. Khi phát triển mã của bạn, bạn nghĩ về tương thích về phía trước, như ngày mai khi bạn cần chuyển đổi lớp đơn này thành lớp bình thường hoặc cho phép lớp con. 2. Bạn có thể cung cấp tính năng tải chậm, khi lớp singleton này nặng.

tĩnh: Cách sử dụng: các lớp về cơ bản thực hiện chuyển đổi, chức năng tiện ích. xin vui lòng kiểm tra lớp Toán.

Khi nào cần đi: 1. lớp trợ giúp, được sử dụng bởi tất cả các lớp trong quá trình phát triển api của bạn.

bất lợi: 1. các lớp học được tải háo hức.

các điểm mong đợi từ người khác.

Các vấn đề liên quan