(一)设计模式系列---单例模式
程序员文章站
2022-06-05 20:58:01
一、单例模式 在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 二、分类 分为懒汉式和饿汉式两种; 三、应用场景 1.需要频繁实例化然后销毁的对象。 2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 3.有 ......
一、单例模式
在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
二、分类
分为懒汉式和饿汉式两种;
三、应用场景
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