一、单例模式

在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。

二、分类

分为懒汉式和饿汉式两种;

三、应用场景

 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

 

posted on 2019-04-01 00:11  一只小飞机  阅读(515)  评论(0编辑  收藏  举报