单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例设计模式保证一个类只有一个实例,并提供访问它的全局访问点。单列设计模式步骤
1.构造函数私有化
2.声明一个本类实例对象
3.给外部方法提供一个静态方法来获取对象实例
单例设计模式有两种实现方法:饿汉式和懒汉式
1.饿汉式
此实现是线程安全的,多个线程进行访问时不会实例化多个对象,因为static属性只会被初始化一次,缺点是无论是否用到该实例都会被初始化。
package com.longpo;
public class singleton {
public static void main(String[] args) {
//获取Person实例1
Person ok=Person.getInstantPerson();
System.out.println(ok.getName());
//获取Person实例2
Person ok2=Person.getInstantPerson();
System.out.println(ok2.getName());
//判断是否是同一个对象
System.out.println(ok==ok2);
}
}
class Person
{
public String name;
//定义一个本类对象并实例化
private static Person person=new Person("小明");
//构造方法私有化
private Person(String name)
{
this.name=name;
}
//提供静态方法给外部返回该实例
public static Person getInstantPerson()
{
return person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.懒汉式
此实现缺点是线程不安全,当多个线程同时访问的时候,极可能实例化出多个对象。懒汉式只有在初次使用对象时才去实例化。
package com.longpo;
public class singleton {
public static void main(String[] args) {
//获取Person实例1
Person ok=Person.getInstantPerson();
System.out.println(ok.getName());
//获取Person实例2
Person ok2=Person.getInstantPerson();
System.out.println(ok2.getName());
//判断是否是同一个对象
System.out.println(ok==ok2);
}
}
class Person
{
//定义一个本类对象
private static Person person=null;
public String name;
//构造方法私有化
private Person(String name)
{
this.name=name;
}
//提供静态方法给外部返回该实例
public static Person getInstantPerson()
{
//需要调用时实例化
if(person==null)
{
person=new Person("小明");
}
return person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
可以使用线程同步代码块synchronized来解决线程不安全问题,把Person改为
class Person
{
//定义一个本类对象
private static Person person=null;
public String name;
//构造方法私有化
private Person(String name)
{
this.name=name;
}
//定义同步代码块的对象锁
public static Object object=new Object();
// 提供静态方法给外部返回该实例
public static Person getInstantPerson() {
// 同步代码块
synchronized (object) {
if (person == null) {
person = new Person("小明");
}
}
return person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一般最常使用的是加入同步代码块后的懒汉式方法来实现单例模式。
单例模式只有一个实例,用于开发中的工具类,如连接数据库的工具类,可能只需要一份。此时就可以使用单例设计模式来解决