Java入门学习-学会使用静态变量、掌握单例模式的用法和原理
2017-06-19 22:08
477 查看
静态变量在上一节已学习使用过,总结为类变量,只占一块内存,与实例化无关。
单例模式的意思是,每个类只有一个实例(一般用于资源管理,可以解决生产者-消费者问题)。
引用一段话
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例: 1、一个党只能有一个主席。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。
单例模式的意思是,每个类只有一个实例(一般用于资源管理,可以解决生产者-消费者问题)。
引用一段话
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例: 1、一个党只能有一个主席。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。
//创建单例 public class SingleExample { //创建一个私有的,静态的实例 private static SingleExample example =new SingleExample(); //创建一个构造方法,不被实例化 private SingleExample(){ } //创建一个唯一可用的对象 public static SingleExample getExample(){ return example; } }
public class UseSingle { //使用单例 public static void main(String[] args) { //SingleExample se=new SingleExample(); //提示 The constructor SingleExample() is not visible。说明私有的构造方法不能实例了 SingleExample se=SingleExample.getExample(); se.test(); //输出Hello SingleExample } }
相关文章推荐
- Java入门学习-学会Scanner的用法。做出一个计算器加法功能。
- Java入门学习-学会try/catch/throw的用法。做出一个计算器除法功能,除以0时程序必须给出提示。
- Java入门学习-学会使用日期函数和日期的计算方法,理解什么是时间戳
- Kafka学习1_kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- java入门学习(11)—接口定义(interface)及使用(implements)
- 黑马程序员java学习第六天,static静态的使用及单例设计模式
- JAVA设计模式之访问者模式原理与用法详解
- Java入门学习-学会用txt文档写一段helloworld,并通过windows命令行编译和执行该Java代码
- 【每周一本书】之《深入浅出强化学习:原理入门》:零起点入门掌握AlphaGo的核心强化学习算法
- Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)
- Java反射学习总结四(动态代理使用实例和内部原理解析)
- 一步步学习java并发编程模式之Active Object模式(五) 使用JDK的内置实现
- java使用redis入门学习--Jedis
- JavaSE视频学习阶段性总结 一(java入门,原生数据类型及使用注意,运算符)
- Java的Jackson库的使用及其树模型的入门学习教程
- 新手入门学习Java程序,重点要掌握哪些!
- JavaSE入门学习12: Java面相对象之static使用方法
- java并发编程学习: ThreadLocal使用及原理
- Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式)
- Java基础学习总结(38)——Lombok的使用和原理