设计模式——单例模式(Singleton)

单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供全局访问点。在面试中,它是考察设计模式知识的热门话题。单例模式通过私有构造函数、静态私有成员变量和公有静态获取实例的方法来实现。它分为懒汉式(延迟初始化)和饿汉式(提前初始化)两种实现方式。单例模式适用于控制实例数目,如用于读取配置文件等场景。
摘要由CSDN通过智能技术生成

单例模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。

公司企业在招聘的时候为了考察员工对设计模式的了解,考的最多的就是单例模式。

设计模式——单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点

(1)该模式拥有一个私有构造函数(确保用户无法直接通过new直接实例化它)。

(2)该模式包含一个静态私有成员变量instance(为了使这个类的所有对象共享这一个成员变量)。

(3)该模式包含一个静态公有方法GetInstance(不通过对象而直接通过类去访问)。GetInstance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实力被创建。

1、单例模式的本质:控制实例数目

2、单例模式的特点:

(1)单例类只能有一个实例

(2)单例类必须自己创建自己的唯一实例

(3)单例类必须给所有其它对象提供这一实例
3、单例模式的分类:

单例模式的实现分为两种:

        懒汉式单例模式(时间换空间)——当需要调用时再进行实例化

class Singleton
{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton GetInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
        return instance;
    }
}

        饿汉式单例模式(空间换时间)——直接进行实例化

class Singleton
{
    private static Singleton instance=new Singleton();
    private Singleton(){}
    public static Singleton GetInstance()
    {
        return instance;
    }
}

4、应用场景:

使用单例模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

单例模式实现读取配置文件的功能:

//xml文件
<?xml version="1.0" encoding="UTF-8"?>
<bookshelf>
 
  <book>
 
      <bookname>JavaWeb开发</bookname>
 
      <author>张三</author>
 
      <price>68.0</price>
 
  </book>
 
   <book>
 
      <bookname>AJAX开发实战</bookname>
 
      <author>李四</author>
 
      <price>100</price>
 
  </book>
 
</bookshelf>
//单例模式实现类
package qhq.Singleton;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class Singleton {
	    private static Singleton instance;
	    private Singleton(){}
	    public static Singleton GetInstance()
	    {
	        if(instance==null)
	        {
	            instance=new Singleton();
	            //File file=new File("");
	            try{
	            	//1.建立DocumentBuilderFactor,用于获得DocumentBuilder对象:
	    	  		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	    	  		//2.建立DocumentBuidler:
	    	  		DocumentBuilder builder = factory.newDocumentBuilder();
	    	  		//3.建立Document对象,获取树的入口:
	    	  		Document doc = builder.parse("src//book.xml");
	    	  		//4.建立NodeList:
	    	  		NodeList node = doc.getElementsByTagName("book");
	    	  		//5.进行xml信息获取
	    	  		for(int i=0;i<node.getLength();i++){
	    	  			Element e = (Element)node.item(i);
	    	  			System.out.println("书名:"+
	    	  					e.getElementsByTagName("bookname").item(0).getFirstChild().getNodeValue());
	    	  			System.out.println("作者:"+
	    	  					e.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());
	    	  			System.out.println("价格:"+
	    	  					e.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());
	    	  		}	
	            }catch(Exception e){
	            	System.err.print("读取配置文件失败!");
	            	e.printStackTrace();
	            }
	        }
	        return instance;
	    }
}
//测试的主类
package qhq.Singleton;

public class Singleton_text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.GetInstance();
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值