단일 모드 분석

6213 단어 Javase 베이스
전재:https://www.cnblogs.com/damsoft/p/6105122.html
단리 모델의 장단점과 사용 장면을 먼저 단례 모델을 소개한다. 단례 모델(Singleton)은 단자 모델이라고도 부르며 자주 사용하는 소프트웨어 디자인 모델이다.이 모델을 응용할 때, 단일 대상의 클래스는 반드시 하나의 실례만 존재할 것을 보장해야 한다.많은 경우 전체 시스템은 하나의 전체적인 대상만 가지면 시스템 전체의 행위를 조율하는 데 유리하다.예를 들어 어떤 서버 프로그램에서 이 서버의 설정 정보는 하나의 파일에 저장되고 이러한 설정 데이터는 하나의 단일 대상이 통일적으로 읽은 다음에 서비스 프로세스의 다른 대상이 이 단일 대상을 통해 이러한 설정 정보를 얻는다.이런 방식은 복잡한 환경에서 배치 관리를 간소화시켰다.단일 모드를 실현하는 사고방식은 하나의 클래스가 대상의 인용(영원히 동일)과 이 실례를 얻을 수 있는 방법(정적 방법이어야 하며 getInstance라는 이름을 사용합니다)이다.우리가 이 방법을 호출할 때, 클래스가 가지고 있는 인용이 비어 있지 않으면 이 인용을 되돌려주고, 클래스가 유지하고 있는 인용이 비어 있으면 클래스의 실례를 만들고, 실례의 인용을 클래스가 유지하고 있는 인용에 부여한다.또한 우리는 이 클래스의 구조 함수를 사유 방법으로 정의하여 다른 곳의 코드는 이 클래스의 구조 함수를 호출하여 이 클래스의 대상을 실례화할 수 없고, 이 클래스가 제공하는 정적 방법을 통해서만 이 클래스의 유일한 실례를 얻을 수 있다.주의해야 할 점: 단일 모드는 다중 라인의 응용 장소에서 반드시 조심스럽게 사용해야 한다.만약에 유일한 실례가 만들어지지 않았을 때 두 개의 라인이 동시에 생성 방법을 호출한다면 그들은 유일한 실례의 존재를 동시에 감지하지 못하고 각각 하나의 실례를 만들었다. 그러면 두 개의 실례가 구조되어 하나의 실례 모델에서 유일한 원칙을 위반하게 된다.이 문제를 해결하는 방법은 클래스가 이미 실례화된 변수를 지시하기 위해 상호 배척 자물쇠를 제공하는 것이다. (비록 이렇게 하면 효율을 떨어뜨릴 수 있지만.)장점: 1.단일 모델에서 활동하는 단일 사례는 하나의 실례일 뿐이고 단일 사례의 모든 실례화에 대해 얻은 것은 같은 실례이다.이렇게 하면 다른 대상이 자신에 대한 실례화를 방지하고 모든 대상이 하나의 실례에 접근하도록 확보한다.단일 모델은 일정한 신축성을 가지고 클래스 자체가 실례화 프로세스를 제어하며 클래스는 실례화 프로세스를 바꾸는 데 상응하는 신축성을 가진다.      3.유일한 실례에 대한 제어 접근을 제공합니다.      4.시스템 메모리에 하나의 대상만 존재하기 때문에 시스템 자원을 절약할 수 있고 빈번하게 창설하고 폐기해야 할 때 단일 모델은 시스템의 성능을 향상시킬 수 있다.      5.가변 수의 인스턴스를 허용합니다.      6.공유 자원의 다중 점용을 피하다.단점변화하는 대상에 적용되지 않는다. 만약에 같은 유형의 대상이 항상 서로 다른 용례 장면에서 변화를 일으키면 한 가지 사례가 데이터의 오류를 일으켜 서로의 상태를 저장할 수 없다.      2.단리 모델에 추상층이 없기 때문에 단례류의 확장은 매우 어렵다.      3.일례류의 직책이 과중하여 어느 정도에'단일 직책 원칙'에 위배되었다.      4.단례를 남용하면 일부 부정적인 문제를 가져올 수 있다. 예를 들어 자원을 절약하기 위해 데이터베이스 연결 탱크의 대상을 단례 클래스로 설계하면 공유 연결 탱크의 프로그램이 너무 많아서 연결 탱크가 넘칠 수 있다.실례화된 대상이 장시간 이용되지 않으면 시스템이 쓰레기로 보고 회수돼 대상 상태가 분실된다.사용 시 주의사항: 1.사용 시 반사 모드로 단례를 만들 수 없습니다. 그렇지 않으면 새로운 대상을 실례화합니다.게으름 피우기 모드 사용 시 라인 안전 문제 주의 3.굶주림 사례와 게으름 사례의 구조 방법은 모두 개인적인 것이기 때문에 계승할 수 없다. 일부 사례는 계승될 수 있다(예를 들어 등록식 모델) 적용 장면. 사례는 하나의 대상만 만들 수 있기 때문에 메모리를 절약하고 대상의 방문 속도를 가속화하기 때문에 대상은 공용적인 장소에서 사용하기에 적합하다. 예를 들어 여러 모듈이 같은 데이터 원본 연결 대상을 사용하는 등이다.예: 1.자주 실례화하고 폐기해야 하는 대상.      2.대상을 만드는 데 너무 많은 시간이 걸리거나 자원을 너무 많이 소모하지만 자주 사용하는 대상입니다.      3.상태가 있는 도구 클래스 객체입니다.      4.데이터베이스나 파일에 자주 접근하는 대상.다음은 모두 단례 모드의 고전적인 사용 장면이다.자원 공유의 경우 자원 조작 시 발생하는 성능이나 손실 등을 피한다.위의 로그 파일과 같이 구성을 적용합니다.      2.자원을 통제하는 상황에서 자원 간의 상호 통신을 편리하게 하다.스레드 탱크 등.응용 장면 예: 1.외부 자원: 컴퓨터마다 몇 개의 프린터가 있지만, 두 개의 프린터 작업이 동시에 프린터로 출력되지 않도록 Printer Spooler만 있을 수 있습니다.내부 자원: 대부분의 소프트웨어는 하나의 속성 파일을 시스템 설정에 저장하고 이런 시스템은 하나의 대상이 이 속성 파일을 관리해야 한다.Windows의Task Manager(퀘스트 관리자)는 전형적인 단일 모드(이건 익숙하죠)입니다. 생각해 보세요. 그렇지 않습니까? 윈도우즈task 관리자 두 개를 열 수 있습니까?못 믿겠으면 직접 해봐~ 3.윈도우즈의 Recycle Bin(휴지통)도 전형적인 단일 응용 프로그램이다.전체 시스템이 운행되는 과정에서 휴지통은 줄곧 유일한 실례를 유지하고 있다.      4. 사이트의 계수기는 일반적으로 단일 모델로 실현되는데 그렇지 않으면 동기화하기 어렵다.      5. 응용 프로그램의 로그 응용 프로그램은 일반적으로 단일 모드로 이루어진다. 이것은 공유된 로그 파일이 계속 열려 있기 때문이다. 왜냐하면 하나의 실례만 조작할 수 있기 때문이다. 그렇지 않으면 내용을 추가하기 어렵다.      6. 웹 응용 프로그램의 설정 대상의 읽기는 일반적으로 단일 모드도 사용하는데 이것은 설정 파일이 공유된 자원이기 때문이다.      7. 데이터베이스 연결 탱크의 디자인도 일반적으로 단일 모델을 채택한다. 왜냐하면 데이터베이스 연결은 데이터베이스 자원이기 때문이다.데이터베이스 소프트웨어 시스템에서 데이터베이스 연결 탱크를 사용하는 것은 주로 데이터베이스 연결을 열거나 닫는 데 발생하는 효율 손실을 절약하는 것이다. 이런 효율상의 손실은 매우 비싸다. 왜냐하면 단일 모델로 유지보수를 하면 이런 손실을 크게 낮출 수 있기 때문이다.      8. 다중 스레드의 스레드 탱크의 디자인도 일반적으로 단일 모델을 사용하는데 이것은 스레드 탱크가 연못 속의 스레드를 제어하는 데 편리하기 때문이다.      9. 운영체제의 파일 시스템도 큰 단일 모델 실현의 구체적인 예로 한 운영체제에 하나의 파일 시스템만 있을 수 있다.      10. HttpApplication 역시 단위 인스턴스의 일반적인 적용입니다.ASP에 익숙하다.Net(IIS)의 전체 요청 생명주기를 가진 사람들은 HttpApplication도 단일 모드이고 모든 HttpModule가 HttpApplication 실례를 공유한다는 것을 알아야 한다.단리 모델을 실현하는 원칙과 과정: 1.단일 모드: 하나의 클래스가 하나의 실례만 있는 것을 확보하고 자체적으로 실례화하여 시스템에 이 실례를 제공한다.단례 모드 분류: 배고픈 단례 모드(클래스가 불러올 때 하나의 대상을 자신의 인용에 실례화), 게으른 단례 모드(실례를 얻는 방법, 예를 들어 getInstance를 호출할 때만 실례화) (java에서 배고픈 단례 모드는 게으른 단례 모드보다 성능이 우수하며, c++에서는 일반적으로 게으른 단례 모드를 사용) 3.단일 모델 요소: a. 사유 구조 방법 b. 사유 정태 인용은 자신의 실례를 가리킨다. c. 자신의 실례를 반환값으로 하는 공유 정태 방법 1.굶주림식: 클래스를 불러올 때 구축되고 초기화됩니다.(사전 로드법)
/**
*  ( )
*
*/
public class Test {
        private Test() {
        }
        public static Test instance = new Test();
        public Test getInstance() {
                return instance;
        }
}

장점 1.스레드 안전 2.클래스를 불러오는 동시에 정적 대상을 만들었습니다. 호출할 때 반응 속도가 빠르고 자원 효율이 높지 않습니다. getInstance () 는 영원히 실행되지 않을 수도 있지만, 클래스를 실행하는 다른 정적 방법이나 클래스 (class. forName) 를 불러오면 이 실례는 초기화됩니다.게으름뱅이: 첫 번째 사용이 시작될 때 구축되고 초기화가 지연됩니다. 
class Test {
        private Test() {
        }
        public static Test instance = null;
        public static Test getInstance() {
                if (instance == null) {
              // instance null , new 
                        instance = new Singleton2();
                }
                return instance;
        }
}

장점: 굶주린 사람이 사용하지 않은 상황에서 사례를 만드는 것을 피하고 자원 이용률이 높으며 getInstance()를 실행하지 않으면 실례가 되지 않고 이런 다른 정적 방법을 실행할 수 있다.단점: 게으름뱅이는 한 라인에 문제가 없지만 여러 라인의 동료가 방문할 때 동료가 여러 개의 실례를 만들 수 있다. 그리고 이 여러 사례는 같은 대상이 아니다. 뒤에 만든 실례는 먼저 만든 실례를 덮어쓰지만 다른 대상을 얻는 상황에 저장된다.이 문제를 해결하는 방법은synchonized를 잠그는 것입니다. 처음 불러올 때 빠르지 않고 다중 라인을 사용할 때 불필요한 동기화 비용이 많습니다.  3.이중 검측
class Test {
        private Test() {
        }
        public static Test instance = null;

        public static Test getInstance() {
                if (instance == null) {
                        synchronized (Test.class) {
                                if (instance == null) {
                                        instance = new Test();
                                }
                        }
                }
                return instance;
        }
}

장점 자원 이용률이 높고 getInstance()를 실행하지 않으면 실례가 되지 않습니다. 이 종류의 다른 정적 방법을 실행할 수 있는 단점은 처음 불러올 때 반응이 빠르지 않습니다. 자바 메모리 모델의 일부 원인으로 인해 가끔 실패할 수 있습니다.정적 내부 클래스
class Test {
        private Test() {
        }

        private static class SingletonHelp {
                static Test instance = new Test();
        }

        public static Test getInstance() {
                return SingletonHelp.instance;
        }
}

장점 자원 이용률이 높고 getInstance()를 실행하지 않으면 실례가 되지 않으며 이 종류의 다른 정적 방법을 실행할 수 있다. 단점은 처음 불러올 때 반응이 빠르지 않다. 일반적으로 굶주린 방식을 사용하는데 자원에 대해 매우 신경을 쓰면 정적 내부 유형을 사용할 수 있고 게으름뱅이와 이중 검측을 권장하지 않는다.

좋은 웹페이지 즐겨찾기