单例模式(Singleton Pattern)

这篇具有很好参考价值的文章主要介绍了单例模式(Singleton Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单例模式

一、模式动机

单例模式(Singleton Pattern)是结构最简单的设计模式,它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以确保系统中一个类只有一个实例,且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。


  1. 定义一个全局变量可以确保对象随时都可以被访问,但是不能防止实例化多个对象。(代码实现)
  2. 更好的办法是让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,并且提供一个访问该实例的方法。(机制实现)

模式定义

  • 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
  • 单例模式的要点有三个:
    • 某个类只能有一个实例
    • 必须自行创建这个实例
    • 必须自行向整个系统提供这个实例
  • 单例模式是一种对象创建型模式

三、模式结构

单例模式(Singleton Pattern)

单例类:

public class Singleton {
    //静态私有成员变量
    private static Singleton instance=null;
        //私有构造函数
    private Singleton() {
    }
       //静态公有工厂方法,返回唯一实例
    public static Singleton getInstance() {
        if(instance==null)
            instance=new Singleton();
        return instance;
    }
}

四、案例分析

案例背景

身份证

案例结构

单例模式(Singleton Pattern)

代码实现

单例类

public class IdentityCardNo {

    private static IdentityCardNo instance = null;
    private String no;

    private IdentityCardNo() {
    }

    public static IdentityCardNo getInstance(){

        if (instance == null){
            System.out.println("第一次办理身份证,分配新号码");
            instance = new IdentityCardNo();instance.setNo("No10086111");
        }else
            System.out.println("重复办理身份证,获取旧号码");

        return instance;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }
}

测试类

public class Client {

    public static void main(String[] args) {
        IdentityCardNo no1,no2;
        no1 = IdentityCardNo.getInstance();
        no2 = IdentityCardNo.getInstance();
        System.out.println("身份证号码是否一致"+(no1 == no2));

        String str1,str2;
        str1 = no1.getNo();
        str2 = no2.getNo();
        System.out.println("第一次号码:"+str1);
        System.out.println("第二次号码:"+str2);
        System.out.println("内容是否相等:"+str1.equalsIgnoreCase(str2));
        System.out.println("是否是相同对象:"+(str1 == str2));
    }

}

案例结果

单例模式(Singleton Pattern)

五、模式分析

  • 私有构造函数
  • 静态私有成员变量(自身类型)
  • 静态公有的工厂方法

  • 单例模式的目的

    • 保证一个类只有一个唯一的实例,并为它提供一个全局访问点。
  • 实现单例模式的思想

    • 为了防止客户端程序使用构造函数来创建多个对象,可以将构造函数声明为私有的,这样客户端程序就不可以使用它来创建任何对象。
  • 单例模式的问题

    • 如果声明构造函数为私有类型,那么没有客户端程序可以使用它来创建任何对象,因此它对客户端程序是无用的。

六、总结

单例模式优点

  • 提供了对唯一实例的受控访问
  • 可以节约系统资源,提高系统的性能
  • 允许可变数目的实例(多例类)

单例模式缺点

  • 扩展困难(缺少抽象层)
  • 单例类的职责过重。单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中
  • 由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失

使用情形

  • 系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象
  • 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

扩展

单例模式分类

饿汉式(Eager Singleton):顾名思义,该模式在类被加载时就会实例化一个对象。

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton(); 
    private EagerSingleton() { }
    public static EagerSingleton getInstance() {
        return instance;
    }
}

懒汉式(Lazy Singlenton):该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)

public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }

public static LazySingleton getInstance() {
	if (instance == null) {
		instance = new LazySingleton();
    }
	return instance;
}
}

关于Synchronized 类型的方法

  • Synchronized类型的方法限制每个执行此方法的线程必须在执行下一个线程之前完全执行;
  • 通过这种方式,创建的对象在多个线程的情况下是唯一的;
  • 也就是说,我们已经给Synchronized类型的对象添加了锁。当一个线程执行此方法时,其他方法无法接管。其他线程应该等待.
  • 只有在当前线程执行完该方法后,另一个线程才能开始执行该方法

锁方法:


public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
synchronized public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
        }
return instance;
}
}

锁代码段


public static LazySingleton getInstance() { 
    if (instance == null) {
        synchronized (LazySingleton.class) {
            instance = new LazySingleton();
        }
    }
    return instance;
}

懒汉式与饿汉式比较

懒汉式 饿汉式
实例化 外部调用时 类加载时
线程安全 不安全 安全
执行效率 较低 较高
内存 不浪费 浪费

单例模式实现多例

使用单例模式的思想可以实现多例模式,从而确保系统中某个类的对象只能存在有限个

单例模式(Singleton Pattern)

单例类


//单例模式实现多例,实现3个
public class Multiton {

    private static ArrayList<Multiton> array = new ArrayList<>();

    private Multiton() {
    }

    public static Multiton getInstance(){
        if (array.size() < 3){
            System.out.println("创建实例成功");
            Multiton multiton = new Multiton();
            array.add(multiton);
            return multiton;
        }else {
            System.out.println("不再创建更多实例");
            return array.get(new Random().nextInt(array.size()));
        }
    }

    public int random() {
        int rand = (int) (Math.random()*3);
        return rand;
    }


}

客户测试类文章来源地址https://www.toymoban.com/news/detail-437234.html

public class Client {

    public static void main(String[] args) {
        Multiton m1 = Multiton.getInstance();
        Multiton m2 = Multiton.getInstance();
        Multiton m3 = Multiton.getInstance();
        Multiton m4 = Multiton.getInstance();
        System.out.println("m1=m2"+(m1 == m2));
        System.out.println("m2=m3"+(m2 == m3));
        System.out.println("m3=m4"+(m3 == m4));
    }

}

到了这里,关于单例模式(Singleton Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单例模式(Singleton)

    单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。 1. 问题 单例模式同时解决了两个问题,所以违反了单一职责原则: 保证一个类只有一个实例 。 为该实例提供一个全局访问节点 。 为什么会有人想要控制一个类所拥有的实

    2024年02月11日
    浏览(34)
  • 单例模式(Singleton)

    单例模式 保证一个类仅有一个实例 ,并 提供一个全局访问点来访问它 ,这个类称为单例类。可见,在实现单例模式时,除了保证一个类只能创建一个实例外,还需提供一个全局访问点。 为提供一个全局访问点,可以使用全局变量,但全局变量无法禁止用户实例化多个对象

    2024年02月14日
    浏览(38)
  • 10-单例模式(Singleton)

    保证一个类只有一个实例,并提供一个访问它的全局访问点 优点:安全且在多线程情况下保持高性能。 描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方

    2024年02月03日
    浏览(46)
  • 设计模式四:单例模式(Singleton)

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。 通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象

    2024年02月15日
    浏览(46)
  • java设计模式-单例模式(Singleton)

    单例模式(Singleton)就是一个类只能有一个实例,自行实例化,并向系统提供这一实例,这个类就是单例类。单例模式的特点: 一个类只能有一个实例; 单例类自己实例化; 单例类给其它对象提供这个单一实例。 资源管理类经常被设计为单例模式,例如管理属性文件的类。

    2024年02月15日
    浏览(39)
  • C++ 中的单例模式singleton

    在面向对象编程中,设计模式是解决常见问题的最佳实践。单例模式是其中之一,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在本文中,我们将详细介绍 C++ 中的单例模式。 单例模式是一种设计模式,它限制一个类只能创建一个对象。这个模式通常用

    2024年02月21日
    浏览(44)
  • 《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

    指目标类(Class)只有一个实例对象(Object),并且向使用该对象的客户端提供访问单例的全局方法。 保证类只有一个实例 有方法能让外部访问到该实例 懒汉式 在第一次调用单例对象时创建该对象,这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象,这

    2024年02月14日
    浏览(49)
  • Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   单一的类,只能自己来创建唯一的一个对象。 单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一。这种类型的设计模式属于 创建型模式 ,它提供了一种创建对象的最佳方式。 这种模式涉及到一个 单一的类 ,该类负责 创建自己的对象 ,同时

    2024年02月06日
    浏览(38)
  • 在序列化、反序列化下如何保持单例(Singleton)模式

    1、序列化、反序列化 在 Java 中,当一个对象被序列化后再被反序列化,通常情况下会创建一个新的对象实例。这是因为序列化将对象的状态保存到字节流中,而反序列化则是将字节流重新转化为对象。在这个过程中,通常会使用类的构造函数创建一个新的对象,并将保存的

    2024年02月13日
    浏览(29)
  • C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景

    一、call_once 单例模式 Singleton  大家可以先看这篇文章:https://zh.cppreference.com/w/cpp/thread/call_once call_once 应用在单例模式,以及 关于单例模式我的往期文章推荐: C++ 设计模式----“对象性能“模式_爱编程的大丙 设计模式-CSDN博客 https://heheda.blog.csdn.net/article/details/131466271 二、

    2024年01月23日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包