(十)java初学单例模式

(十)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);//所产生的对象都是相同的
	}
}

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值