欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(一)设计模式系列---单例模式

程序员文章站 2023-10-17 08:47:09
一、单例模式 在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 二、分类 分为懒汉式和饿汉式两种; 三、应用场景 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