Java的单例模式
-
- 一つのJVM、Javaサーバーの中でオブジェクト(インスタンス)が1つだけ生成され、共有するように設計するデザインパターンである。
- オブジェクトを2つ以上生成できないようにprivate生成者を使用し、外部で任意にnewキーワードを使用できないように防ぐ。
-
- ほとんどのSpringアプリケーションはWebアプリケーションで、通常、複数の顧客が同時にリクエストを行う。
- 顧客が要請するたびにオブジェクトを作らなければならないが、そうするとメモリの浪費が激しい。
-
- 如果不是使用单例模式
-
- 每次调用时都会创建一个新对象。
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);
}
}