JAVA基础——设计模式之单列模式

一:单例设计模式

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。

单例设计模式的特点:

  1. 单例类只能有一个实例
  2. 单例必须创建对象
  3. 单例类需要对外提供该对象

核心知识点如下

  1. 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
  2. 在其内部产生该类的实例化对象,并将其封装成private static类型。
  3. 定义一个静态方法返回该类的实例。

二:单例式的分类

1.饿汉模式:

优点是:

  1. 写起来比较简单,
  2. 而且不存在多线程同步问题,
  3. 避免了synchronized所造成的性能问题;

缺点是:

  1. 当类被加载的时候,会初始化static的instance
  2. 静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),
  3. 当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

/**
 * 方法一
 * 单例模式的实现:饿汉式,线程安全 但效率比较低
 */
public class SingletonTest {
    // 定义一个私有的构造方法
    private SingletonTest() {
    }
    // 将自身的实例对象设置为一个属性,并加上Static和final修饰符
    private static final SingletonTest instance = new SingletonTest();
    // 静态方法返回该类的实例
    public static SingletonTest getInstancei() {
        return instance;
    }  

}


2.饱汉式(懒汉式)

优点是

  1. 写起来比较简单,
  2. 当类被加载的时候,静态变量static的instance未被创建并分配内存空间
  3. 当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存

缺点是

  1. 并发环境下很可能出现多个SingletonTest实例。

/**
 *方法二
 * 单例模式的实现:饱汉式,非线程安全
 *
 */
public class SingletonTest {    // 定义私有构造方法(防止通过 new SingletonTest()去实例化)
    private SingletonTest() {
    }
    // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
    private static SingletonTest instance;
    // 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)
    public static SingletonTest getInstance() {
        if (instance == null)
            instance = new SingletonTest();
        return instance;
    }
} 

3.方法二的简单优化版

优点是:使用(同步锁)synchronized关键字避免多线程访问时,出现多个类的实例。 缺点是:同步方法频繁调用时,效率略低。

/**
 *方法三
 * 单例模式的实现:饱汉式,线程安全简单实现
 *
 */
public class SingletonTest {
    // 定义私有构造方法(防止通过 new SingletonTest()去实例化)
    private SingletonTest() {
    }
    // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
    private static SingletonTest instance;
    // 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)
    public static synchronized  SingletonTest getInstance() {
        if (instance == null)
            instance = new SingletonTest();
        return instance;
    }
} 

4单例模式的最佳实现

  1. 内存占用地
  2. 效率高
  3. 线程安全
  4. 多线程操作原子性。

/**
 * 方法四
 * 单例模式最优方案
 * 线程安全  并且效率高
 *
 */
public class SingletonTest {
    // 定义一个私有构造方法
    private SingletonTest() {
    }
    //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    private static volatile SingletonTest instance;
    //定义一个共有的静态方法,返回该类型实例
    public static SingletonTest getIstance() {          // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
        if (instance == null) {             //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (SingletonTest.class) {                 //未初始化,则初始instance变量
                if (instance == null) {
                    instance = new SingletonTest();
                }
            }
        }
        return instance;
    }
}

(事实上,可以通过Java反射机制来实例化private类型的构造方法,此时基本上会使所有的Java单例实现失效。本帖不讨论反射情况下问题,默认无反射,也是常见的面试已经应用场景)

原文地址:https://www.cnblogs.com/huan-guo/p/8568185.html

时间: 2024-10-12 03:28:27

JAVA基础——设计模式之单列模式的相关文章

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl

java常用设计模式之 工厂模式

工厂模式: 定义 一个用于创建对象的接口,让子类决定实例化哪一个类. 一句话概括: 是一个类的实例化延迟到其子类.     适用于 以下情况: ①:当一个类 ,不知道它所必须创建的对象的类的时候. ②:当一个类,希望由它的子类来指定它所创建的对象的时候. ③:当类将创建对象的职责给多个帮助子类中的一个,并且希望将哪一个帮助子类是代理这一信息局部化的时候. 说明: ① Product :定义工厂方法所创建的对象的接口. ② ConcreteProduct:实现Product 接口. ③ Creat

Java常见设计模式之工厂模式

工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple Factory):不利于产生系列产品:     2)工厂方法模式(Factory Method):又称为多形性工厂:     3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品:        这三种模式从上到下逐步抽象,并且更具一般性.         GOF

IT十八掌Java基础 设计模式

      Day20 扩展知识 面向对象思想设计原则 设计模式 设计模式的分类 常见的设计模式 简单工厂模式和工厂方法模式(接口) 模版设计模式(抽象类) 装饰设计模式(IO流) 单例设计模式(多线程) 适配器模式(GUI) 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设计原则 单一职责原则 开闭原则 里氏替换原则 依赖注入原则 接口分离原则 迪米特原则   单一职责原则 其实就是开发人员经常说的"高内聚,低耦合" 也

PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式

三种基础设计模式(所有面向对象设计模式中最常见的三种): ① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new 在 Common 目录下新建 Factory.php: <?php namespace Common; class Factory{ static function createDatabase(){ //$db = new \Common\Database; $db = new Database; return $db; } } index.php: <?php de

设计模式之--单列模式

单例模式就是某个类只存在一个对象(只new 一次),当某个类的初始化比较耗时,耗资源的时候,比如hibernate写在Dao模式中创建session的时候必须写成单例模式,因为你每做一次数据库的操作,都必须创建一个session,这时候用单例模式是最好的,每次都只是同一个实例,sessionFactory 这个是单例的当然了是一个数据库的时候是单例的,整个服务仅使用这么一个工厂就足够了.好多工厂类基本上都是单例的. 单列模式中的两种基本模式 饿汉式.懒汉式.饿汉式是线程安全的,在加载类时创建实例

JAVA基础——设计模式之装饰者模式

装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装饰器中,用到的地方进行调用. 装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.引入装饰类,扩充新功能. 角色 抽象构件 具体构件 抽象装饰类 具体装饰类 案例一,窗体装饰 1.组件类 package Decorator; // 装饰者模式 /** * Created by Jiqing on 2016/

Java的设计模式----strategy(策略模式)

设计模式: 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写“简单”的代码. 这个“简单”不是功能的简单,而是设计的简单.简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的

java基础---设计模式、内部类、反射

1.什么是设计模式 (1)设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. (2)此术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的. (3)使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.程序的重用性. 2.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.