java 中的单列设计模式
2016-03-15 16:52
429 查看
一、什么是单例模式:
单例模式确保某一个类只有一个实例,而且向这个系统提供这个实例。
二、单例模式的要点:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、必须自行向这个系统提供这个实例
举例:饿汉式单例类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton2.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:34:51 PM
* @revision $Id: *
***********************************************************************/
public class Singleton2 {
private static Singleton2 singleton2 = new Singleton2();
private Singleton2(){
}
public static Singleton2 getInstance(){
return singleton2;
}
}
2:懒汉式单利类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton1.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:32:04 PM
* @revision $Id: *
***********************************************************************/
public class Singleton1 {
private static Singleton1 ingleton1;
private Singleton1(){
}
public static synchronized Singleton1 getInstance(){
if(null==ingleton1){
ingleton1= new Singleton1();
}
return ingleton1;
}
}
3:同步安全单列类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton3.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:36:34 PM
* @revision $Id: *
***********************************************************************/
public class Singleton3 {
private static Singleton3 singleton3;
private Singleton3() {
}
public static synchronized Singleton3 getInstance() {
if (null == singleton3) {
synchronized (Singleton3.class) {
if (null == singleton3) {
singleton3 = new Singleton3();
}
}
}
return singleton3;
}
}
下面用测试代码说明 只创建一个类
Message (辅助类)
Java代码
package design.Singleton;
/***********************************************************************
*
* Message.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:47:32 PM
* @revision $Id: *
***********************************************************************/
public class Message {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
测试类
Java代码
package design.Singleton;
import java.util.ArrayList;
import java.util.List;
/***********************************************************************
*
* test.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:39:48 PM
* @revision $Id: *
***********************************************************************/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Singleton3> list = new ArrayList<Singleton3>();
for (int i=0;i<5;i++){
Singleton3 s1=Singleton3.getInstance();
if(!list.contains(s1)){
list.add(s1);
}
}
List<Message> list2 = new ArrayList<Message>();
for (int i=0;i<5;i++){
Message m= new Message();
if(!list2.contains(m)){
list2.add(m);
}
}
System.out.println("size"+list.size());
for (Singleton3 s:list){
System.out.println("hashcode"+s.hashCode());
}
System.out.println("size2"+list2.size());
for (Message s:list2){
System.out.println("hashcode2"+s.hashCode());
}
}
}
测试结果分析Singleton3 只创建一个类 list 个数只有一个(如果放开代码 if(!list.contains(s1)){ )显示hashcode 值相同 而Message 创建5个对象 list个数为5个 hashcode值分别不相同。
所以 单列类只创建一个实例
单例模式确保某一个类只有一个实例,而且向这个系统提供这个实例。
二、单例模式的要点:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、必须自行向这个系统提供这个实例
举例:饿汉式单例类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton2.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:34:51 PM
* @revision $Id: *
***********************************************************************/
public class Singleton2 {
private static Singleton2 singleton2 = new Singleton2();
private Singleton2(){
}
public static Singleton2 getInstance(){
return singleton2;
}
}
2:懒汉式单利类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton1.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:32:04 PM
* @revision $Id: *
***********************************************************************/
public class Singleton1 {
private static Singleton1 ingleton1;
private Singleton1(){
}
public static synchronized Singleton1 getInstance(){
if(null==ingleton1){
ingleton1= new Singleton1();
}
return ingleton1;
}
}
3:同步安全单列类
Java代码
package design.Singleton;
/***********************************************************************
*
* Singleton3.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:36:34 PM
* @revision $Id: *
***********************************************************************/
public class Singleton3 {
private static Singleton3 singleton3;
private Singleton3() {
}
public static synchronized Singleton3 getInstance() {
if (null == singleton3) {
synchronized (Singleton3.class) {
if (null == singleton3) {
singleton3 = new Singleton3();
}
}
}
return singleton3;
}
}
下面用测试代码说明 只创建一个类
Message (辅助类)
Java代码
package design.Singleton;
/***********************************************************************
*
* Message.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:47:32 PM
* @revision $Id: *
***********************************************************************/
public class Message {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
测试类
Java代码
package design.Singleton;
import java.util.ArrayList;
import java.util.List;
/***********************************************************************
*
* test.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:39:48 PM
* @revision $Id: *
***********************************************************************/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Singleton3> list = new ArrayList<Singleton3>();
for (int i=0;i<5;i++){
Singleton3 s1=Singleton3.getInstance();
if(!list.contains(s1)){
list.add(s1);
}
}
List<Message> list2 = new ArrayList<Message>();
for (int i=0;i<5;i++){
Message m= new Message();
if(!list2.contains(m)){
list2.add(m);
}
}
System.out.println("size"+list.size());
for (Singleton3 s:list){
System.out.println("hashcode"+s.hashCode());
}
System.out.println("size2"+list2.size());
for (Message s:list2){
System.out.println("hashcode2"+s.hashCode());
}
}
}
测试结果分析Singleton3 只创建一个类 list 个数只有一个(如果放开代码 if(!list.contains(s1)){ )显示hashcode 值相同 而Message 创建5个对象 list个数为5个 hashcode值分别不相同。
所以 单列类只创建一个实例
相关文章推荐
- 使用JUnit4测试Spring
- iOS UIView动画实践(二):Spring Animation与人机交互
- Dom解析XML文件
- Java之Servlet编程实例一
- 泛型数据容器Demo
- 学习笔记一之transient关键字&foreach循环
- spring 的aop proxy 代理
- [Java基础] 字节流与字符流
- RxJava学习笔记3
- Combination Sum II | Java最短代码实现
- java socket 使用 多线程下载请求
- Java转换为JSON首字母大写
- struts2+Hibernate实现用户登陆功能
- 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)
- JAVA集合框架和集合
- Spring IOC容器基本原理
- Java 逻辑运算符
- Java Collection笔记之ArrayList
- java基础(一)
- Spring笔记--xml配置文件详解