어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
-> 전역변수를 사용하지 않고 객체를 하나만 생성하며, 생성한 객체를 어디에서든지 참조할수있도록 하는 패턴
주로 서버와 Socket Connection, DB JDBC Connetion, 스프링의 Bean 등에 사용한다.
세븐틴 (Seventeen) 이라는 객체가 있다.
public class Seventeen{}
이 클래스를 Carat에서 한 번만 호출될 수 있도록 생성자를 외부에서 호출 할 수 없게 Seventeen 클래스의 생성자를 private로 선언한다.
public class Seventeen{ private Seventeen(){} public void performance(){ } }
생성자가 private면 객체를 생성 할 수 없으므로, 외부에 제공할 자기자신의 인스턴스를 생성한다.
자기자신을 선언해서 메모리에 올려놓는다(static)
public class Seventeen{ private static Seventeen svt = new Seventeen(); private Seventeen(){} public void performance(){ } }
* static 메서드: 클래스의 인스턴스를 사용하지 않고서 메서드를 실행할수 있고, 변수를 참조할 수 있다.
선언된 인스턴스 외부에 제공하는 메서드 추가
public class Seventeen{ private static Seventeen svt = new Seventeen(); private Seventeen(){} public static Seventeen getInstance(){ return svt; } //퍼포먼스 public void performance(){ } }
- getInstance 메서드 외에는 Seventeen 객체를 생성 및 사용할 수 없다
- private static Seventeen svt= new Seventeen(); 을 통해 최초 한번만 객체 생성
- 생성 이후에 해당 객체를 getInstance를 활용해 return 값으로 받아서 사용한다.
여러개의 객체와 사용하는 서브 객체사이에 복잡한 의존관계가 있을때, 서브 객체를 중간에 facade 인터페이스로 감싸서 사용하기 쉽게 만든것이다.
-> 서로다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나, 객체를 묶어서 새로운 기능을 제공 할 수 있다.