• 概念

    于大二上学期面向对象C++期中考试中有这么道题:一个Computer有多个USB插口,那么意味着这台电脑可以插多个鼠标,但是无论你如何拔插多少个鼠标,桌面上的鼠标一直只显示一个,且多个硬件鼠标都可以操控这个桌面上的鼠标,就这个场景进行程序设计。当时由于没有接触过设计模式当场就蒙蔽了,现在想起来较为简单。

    单利模式保证内存中有且仅有一个对象,对内私有化构造函数,对外提供静态的获取对象引用的方法。

  • 饿汉模式:顾名思义形容很饥饿,迫不及待的获取对象。通过加载类的时候就已经为对象分配了内存。对外提供一个公有的静态方法,由于静态方法内部成员必须静态的,所以instance必须也是静态的且不可改变的。
//饿汉模式
public class Mouse {
private String name;
private Mouse(){
System.out.println("初始化对象");
}
private static final Mouse instance=new Mouse();
public static Mouse getInstance(){
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void load(){}
} public class Main {
public static void main(String[] args) {
//Mouse mouse1=Mouse.getInstance();
//mouse1.setName("鼠标");
//Mouse mouse2=Mouse.getInstance();
//System.out.println(mous/e1.getName()+":"+mouse2.getName());
//鼠标:鼠标
Mouse.load();
}
}
  • 懒汉模式:懒汉模式顾名思义就如同一个很懒的人,用到的时候才去准备,总是临时抱佛脚。用到对象的时候才去为对象分配内存。
//懒汉模式
public class Mouse {
private String name;
//去掉final
private static Mouse instance=null;
public static Mouse getInstance(){
if(instance==null){
instance=new Mouse();
}
return instance;
}
private Mouse(){
System.out.println("初始化对象");
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
  • 懒汉模式与饿汉模式的区别

    创建对象的时机不同,饿汉是加载类时就创建,用load()方法证明了,懒汉是随用随创建,这就导致了饿汉模式造成了内存浪费。但是懒汉模式在多线程的情况下,由于判空条件(if instance == null)就会导致对象的不唯一性发生

  • 懒汉模式在多线程的应用
public static synchronized Mouse getInstance(){
if(instance==null){
instance=new Mouse();
}
return instance;
} public static Mouse getInstance(){
synchronized (Mouse.class) {
if (instance == null) {
instance = new Mouse();
}
}
return instance;
}

最新文章

  1. MIP开发常见问题解答
  2. Xamarin的不归路-连接MAC失败
  3. mysql索引的使用和优化
  4. map集合键值对存储,键值不重复,值可以重复
  5. Oracle BIEE 环境迁移所导致的账号登陆问题的解决
  6. git --- push到远端
  7. vim 替换操作
  8. ARM中C和汇编混合编程及示例(转)
  9. linux桌面应用开发之折腾
  10. Oracle数据库作业-4 查询
  11. 移动前端之 zepto
  12. UVA 12169 Disgruntled Judge
  13. Velocity.js发布:更快的动画切换速度
  14. UML视图(四)状态图
  15. winform控件背景透明问题(label..等)
  16. Most Common Solutions to FRM-41839 and .tmp Files Not Being Deleted
  17. C#List<object>排序
  18. 【python练习题】程序2
  19. 使用JQuery反向选择checkbox
  20. spring-retry的简单使用

热门文章

  1. POJ1287(最小生成树入门题)
  2. Ubuntu ssh免密登录
  3. C语言单精度浮点型转换算法
  4. 使用unlist将日期型数据的列表转换为向量时,出现的异常
  5. mysql 中sql语句的执行顺序
  6. 虚拟机出现ping DUP
  7. js中push(),pop(),unshift(),shift()的用法
  8. 2. docker 容器的管理(创建、查看、启动、终止、删除)
  9. .net实现IHttpModule接口顾虑器
  10. nodebrew的安装与使用