Java的单例模式

    • 一つのJVM、Javaサーバーの中でオブジェクト(インスタンス)が1つだけ生成され、共有するように設計するデザインパターンである。

 

    オブジェクトを2つ以上生成できないようにprivate生成者を使用し、外部で任意にnewキーワードを使用できないように防ぐ。

 

    • ほとんどのSpringアプリケーションはWebアプリケーションで、通常、複数の顧客が同時にリクエストを行う。

 

    顧客が要請するたびにオブジェクトを作らなければならないが、そうするとメモリの浪費が激しい。
    1. 如果不是使用单例模式

 

    1. 每次调用时都会创建一个新对象。

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);
}
}

如果使用单例模式
只会生成一个对象,并共享它。

可以节省内存空间。
除了以下示例之外,还有很多其他实现单例模式的方法。
package hello.hellospring.singletone;

public class SingletoneService {

// 1.在静态区域创建一个唯一的对象。
private static final SingletoneService instance = new SingletoneService();

// 2.通过公共方法创建对象实例,只能通过这个静态方法来获取对象实例。
public static SingletoneService getInstance() {
return instance;
}

// 3.将构造函数设为私有,防止从外部使用 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);
}
}

广告
将在 10 秒后关闭
bannerAds