(十)java初学单例模式
1. 什么是单例模式?
顾明思意:所谓单例,即单个实例,一个类只产生一个实例的设计模式叫做单例模式。
2. 为什么要用单例模式?
①节省内存的开销。
②解决多线程的并发问题。(暂时没写)
3. 怎么用?思想是什么?
单例模式的特点:
一个类只能有一个实例,且必须自行的创建此实例,整个系统都得调用这个实例。
如何用:
①私有构造,不让其他类直接进行实例化
②创建私有静态变量实例,时外部无法访问
③提供一个公有的静态方法,让其他类可以访问到实例
实例:设计一个用于用户注册的类。
①定义一个用于用户注册的接口UserService
public interface UserService {
//用户注册功能
public boolean userRegist(String name,String pwd);
}
②定义一个实现该接口的类UserServiceImp1,不使用单例模式
public class UserServiceImp1 implements UserService {
//构造方法,每次new一个对象都会调用一次
public UserServiceImp1() {
System.out.println("非单例产生一次对象");
}
//实现用户注册方法
@Override
public boolean userRegist(String name, String pwd) {
System.out.println(name+" "+pwd);
System.out.println("非单例注册");
return false;
}
}
③定义一个实现该接口的类UserServiceImp2,使用单例模式
public class userServiceImp2 implements UserService {
//1 私有构造,不让别的类进行直接的实例化
private userServiceImp2() {
System.out.println("使用单例模式构造,只使用一次构造,以后每次都用这个对象");
}
//2 私有静态变量,外部不能访问
//利用static关键字,只会创建一次可以让全部对象共享的特点
private static userServiceImp2 instance=new userServiceImp2();
//3 提供一个公共的静态方法,让别的类可以访问到instance
public static userServiceImp2 getInstance() {
return instance;
}
@Override
public boolean userRegist(String name, String pwd) {
System.out.println("单例注册");
return false;
}
}
④新建一个测试类。
public class TestSignleton {
public static void main(String[] args) {
//模拟100人同时注册
//每当有一个人注册,就要new一次,增加了内存的开销
//为了简化结果,就写了2个人
for (int i = 0; i < 2; i++) {
UserService service=new UserServiceImp1();
service.userRegist("非单例", "123");
}
System.out.println("-----上:非单例--下:单例---------------");
//使用单例注册。全程都只new了一次
for (int i = 0; i < 2; i++) {
UserService service=userServiceImp2.getInstance();
service.userRegist("单例", "666");
}
System.out.println("--------分隔符--------------");
UserService u1=new UserServiceImp1();
UserService u2=new UserServiceImp1();
System.out.println(u1==u2);//产生的对象是不同的
UserService u3=userServiceImp2.getInstance();
UserService u4=userServiceImp2.getInstance();
System.out.println(u3==u4);//所产生的对象都是相同的
}
}
输出结果: