单例模式

场景和问题(比如:数据库连接池,系统参数配置,Java API 中的 Runtime, Calendar ... , 配置文件的读取类

1)解决方案
本质
-控制实例的数量
2)体现的一些思想
-延迟装载(需要时才引用加载)
-缓存
--把数据放到缓存中,调用时先从缓存中查找,如果有直接取出,如没有到数据库中查,然后放到内存中。
3)实现思路
-不能再外部new 对象, 如果能new 则没法控制对象的个数了,所以构造要定义成private
-一个私有该对象类型的属性,一个public的方法以便得到这个对象的实例
-不能在外部new对象,则方法和属性就得是static的
变形使用
一.时间换空间(多了一个if判断, 一般优先用此方法)
//注意多线程同步的问题
Public class Singleton{
Private static Singleton obj = null;
//1)对外禁用new
Private Singleton(){
}
//2)如何构造为private则不能在外部new对象,要有一个类方法才行,所以要有个static的方法(static相当于一个全局的概念)
Public static synchronized Singleton getInstance(){
//3)只生成一个对象实例
//延迟装载
If(obj == null){
Obj = new Singleton();
} //缓存
return obj;
}
}

二.空间换时间(static 类加载时就new 多个类就new多个实例,占用空间)
Public static class Singleton{
Private static Singleton obj = new Singleton();
Private Singleton(){
}
Public static Singleton getInstance(){
Return obj;
}
}

三。缓存的写法
//1.定义一个缓存数据的容器
private static Map map = new HashMap();
public static A getInstance(){
//2.到缓存中查询所要数据
A a = (A)map.get("one");
//3. 如果找不到
if(a == null){
//3.1 如果找不到,就新建一个对象,或者重数据库中读取
a = new A();
//3.2 把新数据放到缓存中
map.put("one", a);
}
//如果找到了就直接使用
return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值