싱글 톤 간단한 인스턴스 디자인 패턴 분석
머리말
오늘 저는 Android Development -Singleton Mode에서 가장 일반적으로 사용되는 디자인 패턴에 대한 포괄적 인 요약을 제공합니다.
디자인 패턴에 대한 소개와 관련하여, 당신은 내가 쓴 내용을 읽을 수 있습니다 : 1 분 "디자인 패턴"을 완전히 이해합니다.
목차
1. 소개
1.1 어떤 문제가 해결되었는지
앞에서 언급했듯이 디자인 패턴 = 특정 유형의 특정 문제에 대한 솔루션, 그렇다면 싱글 톤 패턴은 어떤 문제입니까?
의미 : 싱글 톤 = 인스턴스;
문제 해결 : 물체 사이의 커플 링을 줄입니다
솔루션 : 싱글 톤 패턴, 즉 클래스에 인스턴스화 된 객체가 하나만 있고 글로벌 액세스 포인트를 제공한다는 구현
1.2 인스턴스 소개
다음으로 인스턴스를 사용하여 싱글 톤 패턴을 소개합니다
배경 : Xiaocheng에는 플라스틱 공장이 있지만 내부에는 창고가 하나뿐입니다.
목적 : 코드를 사용하여 창고 관리를 구현하고 싶습니다.
현재 관행 : 창고 및 근로자를 설립하십시오
그중에서도 창고 클래스의 수량 = 상품의 수량; 근로자는 처리 방법이 이동 (int I) 및 이동 (INT I)을 가지고 있습니다.
문제 : 테스트를 통해 근로자가 움직일 때마다 새로운 창고가 건설 될 것입니다. 즉, 상품이 동일한 창고에 배치되지 않습니다. 무슨 일이야? (아래 코드 참조)
Package Scut.DesignModel.SingletonPattern; // Warehouse Class Class Storhouse {private int rater = 100; 공공 void setquantity (int reter) {this.quantity = 수량; } public int getQuantity () {return retity; }} // Walking Human Class Carrier {Public Storehouse Mstorehouse; 공공 사업자 (창고 창고) {Mstorehouse = 창고; } // 상품을 창고로 옮기는 공개 무효 이동 (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()+i); } // 창고 밖으로 이동하여 공개 무효 이동 (int i) {mstorehouse.setquantity (mstorehouse.getquantity () -i); }} // 작업자 처리 테스트 공개 클래스 SinglePattern {public static void main (String [] args) {Storehouse MStorehouse1 = New Storehouse (); 창고 mstorehouse2 = 새로운 저장소 (); 캐리어 캐리어 1 = 새로운 캐리어 (Mstorehouse1); 캐리어 캐리어 2 = 새로운 캐리어 (Mstorehouse2); System.out.println ( "둘은 동일합니까?"); if (mstorehouse1.equals (mstorehouse2)) {// == 기호는 두 객체 system.out.println의 주소를 비교하기 위해 == 기호 대신에 여기에서 equals를 사용합니다 ( "동일하다"); } else {system.out.println ( "동일하지 않음"); } // 포터가 상품을 이동 한 후, 창고 운송 업체의 상품 수량을보고합니다 .1.movein (30); System.out.println ( "창고 제품 마진 :"+carrier1.mstorehouse.getquantity ()); carrier.moveout (50); System.out.println ( "창고 제품 마진 :"+carrier2.mstorehouse.getQuantity ()); }}결과:
둘이 동일합니까? 같은 창고에서의 제품 마진 : 130 창고 제품 마진 : 50
2. 싱글 톤 패턴 소개
2.1 해결 된 문제 (응용 시나리오)
갈등 : 위의 결과로부터, 근로자는 분명히 동일한 창고 인스턴스가 아니라는 것을 알 수 있습니다.
목표 : 모든 근로자는 동일한 창고 인스턴스를 운영합니다
싱글 톤 패턴은 이러한 유형의 문제에 대한 해결책입니다. 하나의 인스턴스화 된 객체 만있는 클래스를 구현하고 글로벌 액세스 포인트 2.2 작동 원리를 제공합니다.
Java에서는 객체를 사용하여 (클래스 인스턴스화 후) 이러한 클래스를 운영합니다. 클래스 인스턴스화는 생성자를 통해 수행됩니다 . 클래스에 인스턴스화 된 객체가 하나만 있다는 것을 구현하려면 클래스의 생성자에 대해 작업해야합니다.
싱글 톤 모드의 일반 구현 : (사용 단계 포함)
공개 클래스 싱글 톤 {// 1. 비공개 변수 ourinstance (싱글 톤의 고유 한 인스턴스를 기록하는 데 사용) // 2를 만듭니다. 내부적으로 개인 정적 싱글 턴 인스턴트 ourinstance = new Singleton (); // 3. 클래스의 생성자를 민영화하고 개인 싱글 톤 () {} // 4를 인스턴스화하기위한 외부 호출을 방지하십시오. 클래스 // 5에 대한 글로벌 고유 액세스 포인트를 제공하는 공개 방법을 정의하십시오. getInstance () 메소드를 호출하여 고유 인스턴스를 외부로 반환합니다. public static singleton newinstance () {return ourinstance; }}좋아, 싱글 톤 패턴의 소개와 원리를 이해해야합니까? Xiaocheng 위에 나타난“창고가 동일하지 않음”이라는 문제를 해결해 봅시다!
2.3 예제 소개
Xiaocheng은 싱글 톤 모드를 사용하여 위의 예에 대한 코드를 개선합니다.
패키지 scut.designmodel.singletonpattern; import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; // Singleton Warehouse Class Storhouse {// 개인 int 수량의 수량 = 100; // 개인 정적 창고 인스턴트 인스턴스 ousInstance = new Storehouse () ;; // 외부를 getInstance () 메서드를 호출하여 고유 인스턴스를 반환하십시오. 공개 정적 창고 getInstance () {return ourinstance; } // 폐쇄 된 생성자 개인 저장소 () {} public void setquantity (int quantity) {this.quantity = 수량; } public int getQuantity () {return retity; }} // Carrier Man Class Carrier {Public Storehouse Mstorehouse; 공공 사업자 (창고 창고) {Mstorehouse = 창고; } // 상품을 창고로 이동 공개 무효 이동 (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()+i); } // 창고 밖으로 이동하여 공개 무효 이동 (int i) {mstorehouse.setquantity (mstorehouse.getquantity () -i); }} // 작업자 처리 테스트 공개 클래스 SinglePattern {public static void main (String [] args) {Storehouse mstorehouse1 = storehouse.getInstance (); 창고 mstorehouse2 = Storehouse.getInstance (); 캐리어 캐리어 1 = 새로운 캐리어 (Mstorehouse1); 캐리어 캐리어 2 = 새로운 캐리어 (Mstorehouse2); System.out.println ( "둘은 동일합니까?"); if (mstorehouse1.equals (mstorehouse2)) {System.out.println ( "동일하다"); } else {system.out.println ( "동일하지 않음"); } // 포터가 상품을 이동 한 후, 창고에 상품의 수량을보고합니다. System.out.println ( "창고 제품 마진 :"+carrier1.mstorehouse.getquantity ()); carrier.moveout (50); System.out.println ( "창고 제품 마진 :"+carrier2.mstorehouse.getQuantity ()); }}결과:
둘이 동일합니까? 같은 창고 상품 마진 : 130 창고 상품 마진 : 80
결과 분석에 따르면, 싱글 톤 모델을 사용한 후, 창고 클래스에는 창고 인스턴스가 하나 뿐이며 포터가 잘못된 창고에 들어가는 것에 대해 걱정할 필요가 없습니다! ! !
2.4 장점
2.5 단점
3. 싱글 톤 모드 구현
3.1 일반적인 상황
배고픈 스타일 (가장 간단한 싱글 톤 구현 방법)
클래스 싱글 톤 {private static singleton ourinstance = new Singleton (); Private Singleton () {} public static singleton newinstance () {return ourinstance; }}응용 프로그램 시나리오 :
게으른 스타일
게으른 것과 배고픈의 가장 큰 차이점은 싱글 톤의 초기화 작업시기 입니다.
클래스 싱글 톤 {private static singleton ourinstance = null; private singleton () {} public static singleton newinstance () {if (ourinstance == null) {ourinstance = new Singleton (); } reconse -outinstance; }}응용 프로그램 시나리오 :
3.2 멀티 스레딩에서 싱글 톤 모드 구현
멀티 스레딩의 경우 :
솔루션 1 : 잠금을 동기화합니다
동기화 잠금 동기화 (Singleton.class)를 사용하여 여러 스레드가 동시에 들어가는 것을 방지하여 인스턴스가 여러 번 인스턴스화됩니다.
클래스 싱글 톤 {private static singleton ourinstance = null; private singleton () {} public static singleton newinstance () {synchronized (singleton.class) {if (ourinstance == null) {ourInstance = new Singleton (); }} return outinstance; }}해결책 2 : 이중 점검 잠금
동기화 잠금을 기준으로 IF의 레이어 (Synchronized (Singleton.Class) 제외)은 인스턴스가 인스턴스화되고 다음에 들어가면 성능을 향상시키는 것입니다. 객체 잠금을 얻기 위해 동기화 (Singleton.class)를 실행할 필요가 없습니다.
클래스 싱글 톤 {private static singleton ourinstance = null; private singleton () {} public static singleton newinstance () {if (ourinstance == null) {synchronized (singleton.class) {if (ourinstance == null) {ousinstance = new Singleton (); }}} return outinstance; }}해결책 3 : 정적 내부 클래스
JVM 클래스가로드되면 데이터가 동기화됩니다. 내부 클래스 구현을 사용합니다. 내부 클래스에서 개체 인스턴스를 만듭니다.
응용 프로그램이 내부 클래스 JVM을 사용하지 않는 한 싱글 톤 클래스가로드되지 않으며 싱글 톤 객체가 생성되지 않으므로 "게으른"게으른 하중 및 스레드 안전성을 달성합니다.
클래스 싱글 톤 {// 싱글 톤 객체는 내부 클래스가 개인 정적 클래스로로드 된 경우에만 생성됩니다. Singleton2 {private static singleton ourinstance = new Singleton (); } private singleton () {} public static singleton newinstance () {return singleton2.ourinstance; }}해결책 4 : 유형을 열거합니다
가장 간단하고 사용하기 쉬운 싱글 톤 구현 방법 ( "효과적인 Java"에 의해 권장)
Public Enum Singleton {// 싱글 톤 인스턴스 인스턴스 인 열거 요소를 정의합니다. public void dosomething () {}}사용 방법은 다음과 같습니다.
Singleton Singleton = Singleton.instance; Singleton.dosomething ();
5. 요약
이 기사는 주로 원칙 및 구현 방법을 포함한 싱글 톤 모델을 소개합니다. 다음으로 다른 디자인 모델을 계속 설명하겠습니다. 관심이 있으시면 계속주의를 기울일 수 있습니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!