【6】Java单例模式

一、设计模式

1.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

2.设计模式是基于场景的解决方案。如果某个新场景的解决方案被业界认可,那我们就可以定义一个新的设计模式。

3.面向对象的基础设计模式以供有23种,如下图:

--创建型模式(关注对象创建过程)

--结构型模式(关注类和对象组合)

--行为型模式(关注对象之间的通信过程)

 

 

二、单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1、目的

使得类的一个对象成为该类系统中的唯一实例

2、定义

一个类有且仅有一个实例,并且自行实例化向整个系统提供

3、设计要点

(1)这个类只能有一个实例

(2)必须自行创建实例

(3)必须自行向整个系统提供这个实例

4、实现

(1)只提供私有的构造方法

(2)含有一个该类的静态私有对象

(3)提供一个公有的静态方法由于创建、获取静态私有对象

5、代码实现方案

(1)饿汉式

对象创建过程中实例化(在类加载时就创建时护理,速度快,占用空间/内存大,空间换时间;多个线程并发时,线程安全)

(3)懒汉式

静态公有方法中实例化(第一次使用时进行实例化,速度慢,占用空间/内存小,时间换空间;多个线程并发时,存在线程风险)

6、单例模式的优缺点

优点:

1)在内存中只有一个对象,节省内存空间。

2)避免频繁地创建销毁对象,提高性能。

3)避免对共享资源的多重占用。

缺点:

1)扩展比较困难。

2)如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失。

7、单例模式使用场景

1)创建对象时占用资源过多,但同时又需要用到该类对象。

2)对系统内资源要求统一读写。如读写配置信息。

3)当多个实例存在可能引起程序逻辑错误,如号码生成器。

 

 三、饿汉式vs懒汉式

1、代码实现方案

饿汉式

//饿汉式:创建对象实例的时候直接初始化  空间换时间
public class SingletonOne {
    //1、创建类中私有构造
    private SingletonOne(){

    }

    //2、创建该类型的私有静态实例
    private static SingletonOne instance=new SingletonOne();

    //3、创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance(){
        return instance;
    }
}
饿汉式

 

 懒汉式

//懒汉式:类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
//时间换空间
public class SingletonTwo {
    //1、创建私有构造方法
    private SingletonTwo(){

    }

    //2、创建静态的该类实例对象
    private static SingletonTwo instance=null;

    //3、创建开放的静态方法提供实例对象
    public static SingletonTwo getInstance(){
        if(instance==null)
            instance=new SingletonTwo();

        return instance;
    }
}
懒汉式

 

 Test

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SingletonOne one =SingletonOne.getInstance();
        SingletonOne two=SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
        System.out.println("===================================");
        SingletonTwo one1 =SingletonTwo.getInstance();
        SingletonTwo two1=SingletonTwo.getInstance();
        System.out.println(one1);
        System.out.println(two1);
    }

}
Test

 

2、练习 1

 3、练习2

posted @ 2020-05-25 21:30  柠檬不萌!  阅读(271)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end