一、什么是单例模式:
单例模式确保某一个类只有一个实例,而且向这个系统提供这个实例。
二、单例模式的要点:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、必须自行向这个系统提供这个实例
举例:饿汉式单例类
- 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:懒汉式单利类
- 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:同步安全单列类
- 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 (辅助类)
- 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;
- }
- }
测试类
- 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值分别不相同。
所以 单列类只创建一个实例