- 一つのJVM、Javaサーバーの中でオブジェクト(インスタンス)が1つだけ生成され、共有するように設計するデザインパターンである。
- オブジェクトを2つ以上生成できないようにprivate生成者を使用し、外部で任意にnewキーワードを使用できないように防ぐ。
< Singleton を使用する理由 >
- ほとんどのSpringアプリケーションはWebアプリケーションで、通常、複数の顧客が同時にリクエストを行う。
- 顧客が要請するたびにオブジェクトを作らなければならないが、そうするとメモリの浪費が激しい。
-
Singleton パターンでない場合
- 呼び出すたびに新しいオブジェクトを生成する。
package hello.hellospring; import hello.hellospring.member.MemberService; import hello.hellospring.member.MemberServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; public class SingleToneTest { @Test void notSingleTone() { AppConfig appConfig = new AppConfig(); // 呼び出すたびに新しいオブジェクトを生成する。 MemberService memberService1 = appConfig.memberService(); MemberService memberService2 = appConfig.memberService(); System.out.println(memberService1); System.out.println(memberService2); Assertions.assertThat(memberService1).isNotSameAs(memberService2); } }
-
Singleton パターンの場合
- オブジェクトが1つだけ生成され、それを共有する。
- メモリの無駄を省くことになる。
- 以下の例の他にもSingletonパターンを具現する方法は色々ある。
package hello.hellospring.singletone; public class SingletoneService { // 1。 static領域にオブジェクトを1つだけ生成しておく。 private static final SingletoneService instance = new SingletoneService(); //2。 publicで作成し、オブジェクトインスタンスが必要な場合、このstaticメソッドを通じてのみ照会することができる。 public static SingletoneService getInstance() { return instance; } // 3。 生成者をprivateと宣言し、外部からnewキーワードを使ってオブジェクト生成をすることを防ぐ。 private SingletoneService() { } }
package hello.hellospring; import hello.hellospring.singletone.SingletoneService; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; public class SingleToneTest { @Test void singleToneTest() { SingletoneService singletoneService1 = SingletoneService.getInstance(); System.out.println(singletoneService1); SingletoneService singletoneService2 = SingletoneService.getInstance(); System.out.println(singletoneService2); Assertions.assertThat(singletoneService1).isSameAs(singletoneService2); } }