소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수있는 훌륭한 해결책
즉 프로그래밍 노하우가 정리된 레시피책,정답지 같은 개념이다.
서로 다른 소프트웨어 시스템을 개발할 때도 비슷한 문제가 존재하며 또한 처리하는 방식,해결책 사이에서도 공통점이 존재하는데 이러한 유사점을 패턴이라고 칭한다.
정의:객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어 주는 패턴입니다.
인스턴스(Instance) 란
설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
즉, 객체를 소프트웨어에 실체화 하면 그것을 ‘인스턴스’라고 부른다.
예)카페의 와이파이를 사용하여 네트워크에 연결한다고 경우를 생각해봅시다. 카페에서는 와이파이가 필요한 사용자마다 와이파이를 새로 만들어주지는 않습니다.
ID와 패스워드를 알려주어 기존에 있던 네트워크를 공유해서 사용하도록 하죠.
위 상황을 생각하면서 와이파이 클래스를 만들어보도록 합시다.
고객으로부터 와이파이 정보 요청이 오면,
ㄴ 있으면 있는 와이파이 정보 주고
ㄴ 없으면 생성하여 준다.
문제점
1.상속할 수 없다.
위 방식에서는 객체가 어디서든지 원하는 대로 생성되는 걸 방지하기 위해 생성자를 private으로 선언합니다. 바로 이것이 문제가 되는 핵심입니다.
java에서는 생성자를 private으로 선언하면 상속을 할 수 없습니다. 이는 곧 객체지향 프로그램의 핵심인 상속과 다형성을 해치는 개념입니다.
2.강제로 전역 상태
애초에 공유의 목적으로 생성된 클래스이기 때문에 객체를 요청하는 메소드를 public으로 강제할 수밖에 없습니다. 바로 이것이 두 번째 문제의 원인입니다.
특정 메소드가 정보의 은닉 범위, 공개 수준 등등에 전혀 상관없이 public으로 선언할 것을 강제했기 때문에 객체지향 프로그램의 또 다른 핵심인 ‘정보 은닉‘을 해칩니다.
3.객체가 하나인 것을 보장할 수 없다.
사실 싱글턴 패턴 의 핵심은 싱글턴인 것을 보장할 수 있어야 한다는 것입니다.
하지만 java의 고전적 싱글턴 패턴 은 객체가 하나인 것을 보장할 수 없습니다.
멀티쓰레드를 예로 들겠습니다. 해당 인스턴스는 공유돼서 사용되기 때문에 여러 개의 쓰레드가 동시에 접근하여 메소드를 호출할 수 있습니다.
문제는 2개 이상의 쓰레드가 동시에 객체 생성을 하게 되면 2개 이상의 객체가 생성된다는 것입니다. 즉, 싱글턴으로 사용하기 위해 싱글턴 패턴 을 적용했으나, 싱글턴이 아닌 게 되는 것입니다.