0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaのSingleton

Last updated at Posted at 2023-10-24
  • 一つのJVM、Javaサーバーの中でオブジェクト(インスタンス)が1つだけ生成され、共有するように設計するデザインパターンである。
  • オブジェクトを2つ以上生成できないようにprivate生成者を使用し、外部で任意にnewキーワードを使用できないように防ぐ。

< Singleton を使用する理由 >
  • ほとんどのSpringアプリケーションはWebアプリケーションで、通常、複数の顧客が同時にリクエストを行う。
  • 顧客が要請するたびにオブジェクトを作らなければならないが、そうするとメモリの浪費が激しい。
  1. 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);
        }
    }
    
  2. 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);
          }
      }
      
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?