생성자가 여러 차례 호출되더라로 실제로 생성되는 객체는 하나이고 최초 생성이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
1) Story
1. YGEnt는 하나뿐이므로 YGEnt가 여러번 new로 생성시킬 수 없다
2. getInstance()가 처음 호출될때 YGEnt의 객체를 new로 생성하고
멤버변수와 getInstance()를 static으로 설정하여 class에 부속시킨다.
생성자는 private으로 해 외부에서 new로 생성할 수 없게한다.
2) UML Class Diagram
3) Code
1.YGEnt를 new로 여러번 객체생성한다.
public class Main { public static void main(String[] args) { Entertainment entertainment1=new YGEnt(); Entertainment entertainment2=new YGEnt(); entertainment1.debut("위너"); List<Singer> list = entertainment1.debut("빅뱅"); System.out.println(entertainment1); System.out.println(entertainment2); System.out.println(list); } }
entertainment1과 entertainment2의 hashcode 출력결과이다.
factory.YGEnt@5c647e05
factory.YGEnt@33909752
2. YGEnt를 getInstance()로 객체 생성하여 호출한다.
public class YGEnt extends AbstractEnt { private static YGEnt yGEnt; private YGEnt(){} @Override public int recruit() { int cnt=(int)(Math.random()*10+1); return cnt; } @Override public Singer train(String name, int memberCnt) { Singer singer; int cnt=(int)(Math.random()*2); if(cnt==0){ singer=new BoyGroup(name,memberCnt); }else{ singer=new GirlGroup(name, memberCnt); } return singer; } public static YGEnt getInstance(){ if (yGEnt==null) {yGEnt=new YGEnt();} return yGEnt; } }
public class Main2 { public static void main(String[] args) { Entertainment entertainment1=YGEnt.getInstance(); Entertainment entertainment2=YGEnt.getInstance(); System.out.println(entertainment1); System.out.println(entertainment2); List<Singer> list=entertainment1.debut("2NE1"); System.out.println(list); } }
entertainment1과 entertainment2의 hashcode 출력결과이다.
singletone.YGEnt@70dea4e
singletone.YGEnt@70dea4e
#Singletone Pattern은 캐시에 사용된다.
캐시는 캐시의 접근시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.
#CPU캐시
대용량의 메인 메모리 접근을 빠르게 하기 위해 CPU 칩 내부나 바로 옆에 탑재하는 작은 메모리이다. 1980년대 이후 대부분의 CPU는 하나, 많게는 5-6개까지의 서로 다른 기능을 가진 CPU 캐시를 장착하고 있다. 메모리 접근 속도가 늘어나는 것에 비해 CPU의 처리 속도가 훨씬 빠르게 늘어나고 있기 때문에, 용량은 작지만 속도가 빠른 CPU 캐시는 현대 마이크로프로세서의 성능에 직접적인 영향을 미친다.
#버퍼
버퍼(buffer,완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다. 버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다. 다른 말로 '큐(Queue)'라고도 표현한다.
버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다. 보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같은 출력 장치로 내보낼 때 버퍼 안에 저장된다. 이는 전자 통신의 버퍼와 비유할 수 있다. 버퍼는 하드웨어나 소프트웨어에 추가될 수 있지만 버퍼는 상당수가 소프트웨어에 추가된다. 버퍼는 보통 속도가 계속 바뀔 수 있으므로 데이터 수신, 처리 속도에 차이가 있다. (예: 프린터 스풀러)
버퍼는 네트워크 상에서 자료를 주고 받을 때나 스피커에 소리를 재생할 때, 또는 디스크 드라이브와 같은 하드웨어의 입출력을 결합하는 데에 자주 이용된다. 버퍼는 또한 순서대로 데이터를 출력하는 FIFO 방식에서 보통 사용된다.
#버퍼 캐시(buffer cache)는 최근 사용된 디스크 블록을 메모리에 캐시하는 것을 말한다.
디스크 입출력 시간이 메모리 접근 시간보다 크고, 디스크 블록의 접근 패턴에 지역성이 있기 때문에 디스크 블록의 정보를 메모리 공간에 저장해두면 읽기/쓰기 등의 작업시 응답시간을 줄일 수 있다.
가상 메모리는 MMU와 같은 하드웨어의 지원을 받는 반면, 버퍼 캐시는 그렇지 않다. 읽기와 쓰기 동작의 수행 결과가 실제 디스크의 내용과 비동기적이다.
'design patterns' 카테고리의 다른 글
Factory Method Pattern (0) | 2016.05.15 |
---|---|
Software Design Pattern (0) | 2016.05.15 |