java设计模式:单例模式

设计模式是什么?

  设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

设计模式最经常被使用的,比较重要的就是单例模式、抽象工厂模式、工厂模式以及代理模式。

 

这一篇主要写的是设计模式的单例模式:

  单例模式:只允许被实例化出来一个对象,即内存只存在一个类的对象,就叫做单例模式。

  将一个类的构造方法设置为私有的,然后对外提供一个公共的可以调用该类私有构造方法的接口方法。‘

  其实单例模式就是限制外部类不能随意访问本类里边的的构造方法,从而实现外部类不能够随意实例化本类对象的目的, 则一个类要调用单例模式的话,就需要将该类的构造方法设计为私有的,为了让外部类可以实例化出来一个该类的对象,就需要给外部类提供一个可以访问到本类私有构造方法的对外方法。

  单例模式的应用体现:电脑的任务栏,只能创建一个,当有一个任务栏时,再创建仍是展示之前的任务栏。

  单例模式的设计分两种:

    饿汉模式

    懒汉模式

/**
 * 饿汉式设计模式
 * 在类加载的时候,就将类的对象实例化出来,放在内存里,在用户使用的时候直接调用
 * 特点:
 * 因为在类加载的时候,就已经实例化了对象,所以内存里会一直有这个对象,占用内存空间,
 * 同样因为已经实例化了对象,所以调用时不需要在创建对象,所以效率较高点。
 */
public class HungryDemo {
    /*static修饰为全局变量,在内存中只存在一个该变量的对象*/
    private static HungryDemo hungryDemo = new HungryDemo();
    private HungryDemo(){}

    /*对外提供该类对象的接口*/
    public static HungryDemo getBean() {
        return hungryDemo;
    }
}

  

/**
 * 懒汉式单例模式
 * 在类被加载的时候,没有实例化对象,当用户需要使用对象的时候,才实例化对象
 * 特点:
 * 在类被加载的时候,内存里没有该类的对象,所以会节省内存空间,
 * 但是当用户使用的时候,因为还需要先去实例化对象,所以效率相对而言低
 */
public class StarvingDemo {
    /*创建一个全局变量赋值为空*/
    private static StarvingDemo s = null;

    private StarvingDemo() {
    }

    public static StarvingDemo getBean() {
        /*判断对象是否被实例化,如果已经实例化,就返回该对象,否则就实例化对象*/
        if (s != null) {
            System.out.println("对象已经被实例化");
            return s;
        }
        return s= new StarvingDemo();
    }

}

测试创建对象是否为单例对象:

public class Demo1 {
    public static void main(String[] args) {
        HungryDemo bean = HungryDemo.getBean();
        HungryDemo bean1 = HungryDemo.getBean();
        System.out.println(bean == bean1);

        StarvingDemo bean2 = StarvingDemo.getBean();
        StarvingDemo bean3 = StarvingDemo.getBean();
        System.out.println(bean2 == bean3);
    }
}

 

单例模式的应用场景:

  1.在应用场景中,某类对象只要求生成一个对象的时候,如:任务管理器,聊天窗口,office文件等。

  2.当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如web中的配置对象,数据库的连接池等。

  3.当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池,网络连接池等。

posted @ 2019-07-05 20:20  Zs夏至  阅读(133)  评论(0编辑  收藏  举报