一、单例模式
在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
二、分类
分为懒汉式和饿汉式两种;
三、应用场景
1.需要频繁实例化然后销毁的对象。
2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
3.有状态的工具类对象。
4.频繁访问数据库或文件的对象。
四:代码实现
1.饿汉式
public class Person { /* 1.用final修饰,保证引用不可改变,保证唯一性; 2.饿汉式优缺点 优点 (1)线程安全 (2)在类加载的同时已经创建好一个静态对象,调用时反应速度快 缺点 资源效率不高,可能getInstance()永远不会执行到, 但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 */ public static final Person person = new Person(); private String name; /** * 单例模式构造函数要私有化,防止外部创建 */ private Person() { } public static Person getInstance() { return person; } }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
添加测试方法
public class SingletonTest { public static void main( String[] args ) { Person person1 = Person.getInstance(); Person person2 = Person.getInstance(); Person person3 = Person.getInstance(); Person person4 = Person.getInstance(); person1.setName("zhang"); person2.setName("wang"); person3.setName("li"); person4.setName("zhao"); System.out.println(person1.getName()); System.out.println(person2.getName()); System.out.println(person3.getName()); System.out.println(person4.getName()); } }
输出:
Connected to the target VM, address: '127.0.0.1:52622', transport: 'socket' zhao zhao zhao zhao Disconnected from the target VM, address: '127.0.0.1:52622', transport: 'socket' Process finished with exit code 0
2.懒汉式
public class LazyPerson { private static LazyPerson lazyPerson; private String name; /** * 构造函数私有化 */ private LazyPerson(){ } /** * 优点: * 避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。 * 缺点: * 第一次加载时反应不快,由于java内存模型一些原因偶尔失败 * @return */ public static LazyPerson getInstance(){ if(lazyPerson==null){ //锁住对象 synchronized (LazyPerson.class){ if (lazyPerson==null){ lazyPerson=new LazyPerson(); } } } return lazyPerson; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试方法
public class SingletonTest { public static void main( String[] args ) { // Person person1 = Person.getInstance(); // Person person2 = Person.getInstance(); // Person person3 = Person.getInstance(); // Person person4 = Person.getInstance(); LazyPerson person1 = LazyPerson.getInstance(); LazyPerson person2 = LazyPerson.getInstance(); LazyPerson person3 = LazyPerson.getInstance(); LazyPerson person4 = LazyPerson.getInstance(); person1.setName("zhang"); person2.setName("wang"); person3.setName("li"); person4.setName("zhao"); System.out.println(person1.getName()); System.out.println(person2.getName()); System.out.println(person3.getName()); System.out.println(person4.getName()); } }
执行结果
Connected to the target VM, address: '127.0.0.1:53066', transport: 'socket' Disconnected from the target VM, address: '127.0.0.1:53066', transport: 'socket' zhao zhao zhao zhao Process finished with exit code 0
一只小飞机