Android 단일 모드 싱글 톤 간단 한 인 스 턴 스 디자인 모델 분석
머리말
오늘 은 안 드 로 이 드 개발 에서 가장 많이 사용 되 는 디자인 모델 인 단일 모델 을 전면적으로 정리 하 겠 습 니 다.
디자인 모델 에 대한 소 개 는 제 가 전에 쓴 것 을 볼 수 있 습 니 다.1 분 동안'디자인 모델'을 전면적으로 이해 할 수 있 습 니 다.
목차
1.도입
1.1 어떤 문 제 를 해결 하 는가
전에 말 했 듯 이 디자인 모델=특정한 문제 의 해결 방안,그러면 단일 모델 은 어떤 문 제 를 해결 하 는 해결 방안 입 니까?
의미:단일 예=하나의 인 스 턴 스;
해결 문제:대상 간 결합 도 낮 추기
해결 방법:하나의 사례 모델,즉 하나의 사례 화 대상 만 실현 하고 전체적인 방문 점 을 제공 하 는 것 입 니 다.
1.2 인 스 턴 스 도입
다음 에 나 는 하나의 사례 로 단일 모델 을 도입 할 것 이다.
배경:소성 은 플라스틱 생산 공장 이 있 지만 안에 창고 가 하나 밖 에 없어 요.
목적:코드 로 창고 관 리 를 실현 하고 싶 습 니 다.
기 존 방법:창고 류 와 노동자 류 구축
그 중에서 창고 류 의 quantity=상품 수량;노동자 류 에는 운반 방법 인 Movein(int i)과 MoveOut(int i)이 있다.
문제 발생:테스트 를 통 해 매번 노동자 들 이 운반 작업 을 할 때마다 창 고 를 새로 짓 는 다 는 것 을 알 수 있 습 니 다.바로 화물 이 같은 창고 에 두 지 않 는 다 는 것 입 니 다.이것 은 어떻게 된 일 입 니까?코드 보기)
package scut.designmodel.SingletonPattern;
//
class StoreHouse {
private int quantity = 100;
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
}
//
class Carrier{
public StoreHouse mStoreHouse;
public Carrier(StoreHouse storeHouse){
mStoreHouse = storeHouse;
}
//
public void MoveIn(int i){
mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
}
//
public void MoveOut(int i){
mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
}
}
//
public class SinglePattern {
public static void main(String[] args){
StoreHouse mStoreHouse1 = new StoreHouse();
StoreHouse mStoreHouse2 = new StoreHouse();
Carrier Carrier1 = new Carrier(mStoreHouse1);
Carrier Carrier2 = new Carrier(mStoreHouse2);
System.out.println(" ?");
if(mStoreHouse1.equals(mStoreHouse2)){// equals == , ==
System.out.println(" ");
}else {
System.out.println(" ");
}
//
Carrier1.MoveIn(30);
System.out.println(" :"+Carrier1.mStoreHouse.getQuantity());
Carrier2.MoveOut(50);
System.out.println(" :"+Carrier2.mStoreHouse.getQuantity());
}
}
결과:
?
:130
:50
2.단일 모델 소개2.1 해결 하 는 문제(응용 장면)
충돌:위의 결 과 를 통 해 알 수 있 듯 이 노동자 류 가 같은 창고 의 인 스 턴 스 가 아 닙 니 다.
목표:모든 작업 자 는 같은 창고 인 스 턴 스 를 작 동 합 니 다.
단일 사례 모델 은 이러한 문 제 를 해결 하기 위 한 해결 방안 이다.하나의 사례 화 대상 만 실현 하고 전체적인 방문 점 2.2 작업 원 리 를 제공 하 는 것 이다.
자바 에서 우 리 는 사용 대상(클래스 실례 화 후)을 통 해 이러한 클래스 를 조작 합 니 다.클래스 실례 화 는 그 구조 방법 을 통 해 이 루어 집 니 다.만약 에 하나의 클래스 만 실례 화 대상 을 실현 하려 면 클래스 의 구조 방법 에 공 을 들 여야 합 니 다.
단일 모드 의 일반적인 실현:(사용 절차 포함)
public class Singleton {
//1. ourInstance( Singleton )
//2.
private static Singleton ourInstance = new Singleton();
//3. ,
private Singleton() {
}
//4.
//5. getInstance()
public static Singleton newInstance() {
return ourInstance;
}
}
자,단일 모델 의 소개 와 원 리 는 알 겠 지?그럼 위 에 있 는 작은 성 이 가 나타 난'창고 가 하나 가 아니 야'문 제 를 해결 해 보 자!2.3 사례 소개
소성 은 단일 모드 를 사용 하여 상기 예 의 코드 를 개선 합 니 다.
package scut.designmodel.SingletonPattern;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//
class StoreHouse {
//
private int quantity = 100;
//
private static StoreHouse ourInstance = new StoreHouse();;
// getInstance() 。
public static StoreHouse getInstance() {
return ourInstance;
}
//
private StoreHouse() {
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
}
//
class Carrier{
public StoreHouse mStoreHouse;
public Carrier(StoreHouse storeHouse){
mStoreHouse = storeHouse;
}
//
public void MoveIn(int i){
mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
}
//
public void MoveOut(int i){
mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
}
}
//
public class SinglePattern {
public static void main(String[] args){
StoreHouse mStoreHouse1 = StoreHouse.getInstance();
StoreHouse mStoreHouse2 = StoreHouse.getInstance();
Carrier Carrier1 = new Carrier(mStoreHouse1);
Carrier Carrier2 = new Carrier(mStoreHouse2);
System.out.println(" ?");
if(mStoreHouse1.equals(mStoreHouse2)){
System.out.println(" ");
}else {
System.out.println(" ");
}
//
Carrier1.MoveIn(30);
System.out.println(" :"+Carrier1.mStoreHouse.getQuantity());
Carrier2.MoveOut(50);
System.out.println(" :"+Carrier2.mStoreHouse.getQuantity());
}
}
결과:
?
:130
:80
결과 분석 에 따 르 면 단일 모델 을 사용 한 후에 창고 류 는 하나의 창고 인 스 턴 스 만 있 습 니 다.더 이상 짐꾼 이 창고 에 잘못 들 어 갈 염려 가 없습니다!!2.4 장점
4.567917.유일한 인 스 턴 스 에 대한 제어 접근 을 제공 합 니 다4.567917.시스템 메모리 에 하나의 대상 만 존재 하기 때문에 시스템 자원 을 절약 할 수 있 고 자주 만 들 고 소각 해 야 하 는 대상 의 단일 모델 에 대해 시스템 의 성능 을 향상 시 킬 수 있다4.567917.실제 상황 의 수요 에 따라 단일 모델 을 바탕 으로 두 가지 모델,여러 가지 모델 을 확대 할 수 있다2.5 단점
4.567917.사례 류 의 직책 이 너무 무 겁 고 안의 코드 가 너무 복잡 할 수 있 으 며 어느 정도 에'단일 직책 원칙'에 위배 된다4.567917.실례 화 된 대상 이 장시간 이용 되 지 않 으 면 시스템 이 쓰레기 로 여 겨 져 회수 되 고 대상 상태의 손실 을 초래 할 수 있다3.단일 모델 의 실현 방식
3.1 일반적인 상황
굶 주 린 한식(가장 간단 한 단 례 실현 방식)
class Singleton {
private static Singleton ourInstance = new Singleton();
private Singleton() {
}
public static Singleton newInstance() {
return ourInstance;
}
}
응용 필드:게으름뱅이 식 과 굶 주 린 한식 의 가장 큰 차 이 는 단일 한 초기 화 작업 의 시기 이다.
4.567917.굶 주 린 한식:단일 사례 의 초기 화 를 자동 으로 진행 합 니 다
class Singleton {
private static Singleton ourInstance = null;
private Singleton() {
}
public static Singleton newInstance() {
if( ourInstance == null){
ourInstance = new Singleton();
}
return ourInstance;
}
}
응용 필드:4.567917.단일 초기 화 작업 시간 이 비교적 길 고 응용 은 시작 속도 에 대한 요구 가 있다4.567917.단일 사례 의 점용 메모리 가 비교적 크다4.567917.단일 사례 는 특정한 장면 의 상황 에서 만 사용 된다.즉,필요 에 따라 단일 사례 를 지연 시 키 는 것 이다3.2 다 중 스 레 드 에서 의 단일 사례 모델 실현
다 중 스 레 드 의 경우:
동기 화 잠 금 synchronized(Singleton.class)를 사용 하여 다 중 스 레 드 가 동시에 들 어가 인 스 턴 스 가 여러 번 예화 되 는 것 을 방지 합 니 다.
class Singleton {
private static Singleton ourInstance = null;
private Singleton() {
}
public static Singleton newInstance() {
synchronized (Singleton.class){
if( ourInstance == null){
ourInstance = new Singleton();
}
}
return ourInstance;
}
}
해결 방안 2:이중 검사 자물쇠동기 화 잠 금 기반(synchronized(Singleton.class)에 if 를 추가 하 였 습 니 다.인 스 턴 스 가 정례 화 된 후 다음 에 들 어 갈 때 synchronized(Singleton.class)를 실행 하지 않 아 도 대상 잠 금 을 가 져 와 성능 을 향상 시 키 기 위해 서 입 니 다.
class Singleton {
private static Singleton ourInstance = null;
private Singleton() {
}
public static Singleton newInstance() {
if( ourInstance == null){
synchronized (Singleton.class){
if( ourInstance == null){
ourInstance = new Singleton();
}
}
}
return ourInstance;
}
}
해결 방안 3:정적 내부 클래스JVM 에서 클래스 로 딩 을 할 때 데이터 가 동기 화 되 는 것 을 보장 합 니 다.저 희 는 내부 클래스 로 실현 합 니 다.내부 클래스 에서 대상 인 스 턴 스 를 만 듭 니 다.
응용 프로그램 에서 내부 클래스 JVM 을 사용 하지 않 으 면 이 단일 클래스 를 불 러 오지 않 고 단일 대상 을 만 들 지 않 아'게으름뱅이 식'의 지연 로드 와 스 레 드 안전 을 실현 합 니 다.
class Singleton {
//
private static class Singleton2{
private static Singleton ourInstance = new Singleton();
}
private Singleton() {
}
public static Singleton newInstance() {
return Singleton2.ourInstance;
}
}
해결 방안 4:매 거 유형가장 간결 하고 사용 하기 쉬 운 단일 구현 방식(
public enum Singleton{
// , Singleton
instance;
public void doSomething(){
}
}
사용 방식 은 다음 과 같 습 니 다.
Singleton singleton = Singleton.instance;
singleton.doSomething();
5.총화본 고 는 주로 단일 모델 에 대해 전면적으로 소 개 했 는데 원리 와 실현 방식 을 포함한다.그 다음 에 저 는 다른 디자인 모델 을 계속 설명 하고 관심 이 있 으 면 계속 관심 을 가 질 수 있 습 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.