싱글 톤 패턴 개념 :
Java의 싱글 톤 패턴은 일반적인 디자인 패턴입니다. 싱글 톤 패턴은 게으른 싱글 톤, 배고픈 싱글 톤 및 등록 된 싱글 톤의 세 가지 유형으로 나뉩니다.
싱글 톤 모드에는 다음과 같은 특성이 있습니다.
1. 싱글 톤 클래스에는 하나의 인스턴스 만있을 수 있습니다.
2. 싱글 톤 클래스는 고유 한 인스턴스를 만들어야합니다.
3. 싱글 톤 클래스는이 인스턴스를 다른 모든 객체에 제공해야합니다.
싱글 톤 패턴은 클래스에 하나의 인스턴스 만 있도록하고 자체적으로 인스턴스를 인스턴스화 하고이 인스턴스를 전체 시스템에 제공합니다. 컴퓨터 시스템에서 스레드 풀, 캐시, 로그 객체, 대화 상자, 프린터 및 그래픽 카드의 드라이버 객체는 종종 싱글 톤으로 설계됩니다. 이러한 응용 프로그램에는 리소스 관리자의 기능이 어느 정도 있습니다. 각 컴퓨터에는 여러 프린터가있을 수 있지만 동시에 프린터에 두 개의 인쇄 작업이 출력되는 것을 피하기 위해 하나의 프린터 스풀러 만 사용할 수 있습니다. 각 컴퓨터에는 여러 통신 포트가있을 수 있으며 시스템은 두 개의 요청에 의해 하나의 통신 포트가 동시에 호출되는 것을 피하기 위해 이러한 통신 포트를 중앙에서 관리해야합니다. 요컨대, 싱글 톤 모델을 선택하는 것은 일관되지 않은 상태를 피하고 정치적 강세를 피하는 것입니다.
먼저 고전적인 싱글 톤 구현을 살펴 보겠습니다.
공개 클래스 싱글 톤 {private static singleton coriulinstance = null; 개인 싱글 톤 () {// 인스턴스화를 물리 치기 위해서만 존재합니다. } public static singleton getInstance () {if (고유 인스턴스 == null) {고유 한 싱글 턴 (); } return inverientInstance; } // 기타 방법 ...}싱글 톤은 생성자를 비공개로 제한하여 클래스가 외부에서 인스턴스화되는 것을 피합니다. 동일한 가상 머신 범위에서 싱글 톤의 유일한 인스턴스는 getInstance () 메소드를 통해서만 액세스 할 수 있습니다. (실제로 Java 반사 메커니즘을 통해 개인 구성으로 클래스를 인스턴스화 할 수 있습니다.이 구성은 기본적으로 모든 Java Singleton 구현을 무효화 할 것입니다.이 문제는 여기서 논의되지 않을 것이며 반사 메커니즘이 존재하지 않는다고 생각합니다.
그러나 위의 구현은 스레드 안전 문제를 고려하지 않습니다. 스레드 안전은 다음과 같습니다. 코드가 여러 스레드가 동시에 실행되는 프로세스에 있고 이러한 스레드가 동시에이 코드를 실행할 수 있습니다. 각 실행 결과가 단일 스레드 실행 결과와 동일하고 다른 변수의 값이 예상과 동일하면 스레드 안전입니다. 다시 말해, 클래스 또는 프로그램에서 제공하는 인터페이스는 스레드에 대한 원자 작동이거나 여러 스레드 사이의 전환은 인터페이스의 실행 결과에 대한 모호성을 유발하지 않습니다. 즉, 동기화 문제를 고려할 필요가 없습니다. 분명히, 위의 구현은 스레드 안전 요구 사항을 충족하지 않으며 여러 싱글 톤 인스턴스가 동시 환경에 나타날 가능성이 높습니다.
공개 클래스 TestStream {개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } //이 클래스는 하나의 인스턴스 만 가질 수 있습니다. private testStream () {} // 개인 비 관점 생성자 //이 클래스 자체로 만들어야합니다. //이 클래스는이 인스턴스 객체를 전체 시스템에 자동으로 제공해야합니다. public static testStream getTest () {if (ts1 == null) {ts1 = new TestStream (); } return ts1; } public void getInfo () {system.out.println ( "출력 메시지"+이름); }} public class testmain {public static void main (String [] args) {testStream s = testStream.getTest (); S.SETNAME ( "Zhang Xiaoxiang"); System.out.println (s.getName ()); TestStream S1 = TestStream.getTest (); s1.setName ( "Zhang Xiaoxiang"); System.out.println (s1.getName ()); s.getInfo (); s1.getInfo (); if (s == S1) {System.out.println ( "동일한 인스턴스가 생성되었습니다"); } else if (s! = s1) {system.out.println ( "동일한 인스턴스가 만들지 않음"); } else {system.out.println ( "응용 프로그램 오류"); }}}}실행 결과 :
Zhang Xiaoxiang Zhang Xiaoxiang
출력 메시지 Zhang Xiaoxiang
출력 메시지 Zhang Xiaoxiang은 동일한 인스턴스를 생성했습니다
결론 : 결과에서 싱글 톤 패턴이 객체의 고유 액세스 포인트가있는 객체 지향 응용 프로그램을 제공한다는 것을 알 수 있습니다. 어떤 기능을 구현하든 전체 응용 프로그램은 인스턴스 객체를 공유합니다.
1. 배고픈 싱글 톤
// 배고픈 싱글 톤 클래스. 클래스 초기화시 공개 클래스 Singleton1이 자체적으로 인스턴스화되었습니다 {// 개인 기본 생성자 개인 Singleton1 () {} // 개인 정적 최종 Singleton1 Single = New Singleton1 (); // 정적 공장 방법 public static singleton1 getInstance () {return single; }} 2. 게으른 싱글 톤 클래스
// Laggy Singleton 클래스. 공개 클래스 Singleton2 인스턴트를 처음으로 불렀을 때 공개 클래스 싱글 톤 2 {// 개인 기본 생성자 개인 Singleton2 () {} // 최종 비공개 정적 Singleton2 Single = NULL이 없음에 유의하십시오. // 정적 공장 메소드 공개 동기화 된 static singleton2 getInstance () {if (single == null) {single = new Singleton2 (); } 반환 단일; }} 3. 등록 된 싱글 톤 클래스
java.util.hashmap import; java.util.map import; // 등록 된 싱글 톤 클래스. // 봄의 메소드와 유사하고 클래스 이름을 등록하고 다음에 직접 가져옵니다. 공개 클래스 싱글 톤 3 {private static map <string, singleton3> map = new Hashmap <String, Singleton3> (); 정적 {Singleton3 Single = New Singleton3 (); map.put (single.getClass (). getName (), Single); } // 보호 된 기본 생성자 보호 Singleton3 () {} // 정적 공장 메소드,이 클래스의 고유 인스턴스를 반환합니다. 공개 정적 singleton3 getInstance (string name) {if (name == null) {name = singleton3.class.getName (); System.out.println ( "name == null"+"---> name ="+name); } if (map.get (name) == null) {try {map.put (name, (singleton3)) class.forname (name) .newinstance ()); } catch (InstantiationException e) {e.printstacktrace (); } catch (delegalAccessException e) {e.printstacktrace (); } catch (classNotFoundException e) {e.printstacktrace (); }} return map.get (이름); } // 회로도 상업적 방법 () {return "hello, 나는 regsingleton입니다."; } public static void main (String [] args) {Singleton3 Single3 = Singleton3.getInstance (null); System.out.println (single3.about ()); }} 위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.