设计模式(八)之单例模式

线程安全写法:

public class Singleton {

    /* 线程安全推荐写法 */
    private Singleton() {
    }

    static class SigletonHandler {
        static Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SigletonHandler.instance;
    }

    /* 线程安全双check写法 */
    private static Singleton instance;

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

    /* 线程安全 饿汉写法 */
    private static Singleton instance2 = new Singleton();

    public static Singleton getInstance3() {
        return instance2;
    }
}

平时用到的单例代理类:

public abstract class Lazy<T> implements AutoCloseable {
    private volatile T instance = null;
    protected abstract T makeObject();
    protected abstract void destroyObject(T obj);

    public T get() {
        if (instance == null) {
            synchronized (this) {
                if (instance == null) {
                    instance = makeObject();
                }
            }
        }
        return instance;
    }

    @Override
    public void close() {
        synchronized (this) {
            if (instance != null) {
                T instance_ = instance;
                instance = null;
                destroyObject(instance_);
            }
        }
    }
}

调用代理类:

public class Consumer {

    public static void main(String[] args) {
        Lazy<MyClass> lazy = new Lazy<MyClass>() {
            @Override
            protected MyClass makeObject() {

                return new MyClass(5);
            }

            @Override
            protected void destroyObject(MyClass obj) {
                obj.index = 0;
            }
        };

        MyClass myClass = lazy.makeObject();
    }
}
时间: 2024-09-15 14:10:06

设计模式(八)之单例模式的相关文章

Android设计模式系列之单例模式

单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式. android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析. 单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛. 1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点

iOS App开发中使用设计模式中的单例模式的实例解析_IOS

一.单例的作用顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次.它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值.UIApplication.NSUserDefaults等都是IOS中的系统单例. 二.单例模式的两种写法 1,常用写法 #import "LGManagerCenter.h" static LGManagerCenter *managerCenter; @implementation LGManagerCen

简单讲解在Java编程中实现设计模式中的单例模式结构_java

1. 模式介绍 模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 模式的使用场景 确保某个类有且只有一个对象的场景,例如创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源. 2. UML类图 角色介绍: (1)Client : 高层客户端. (2)Singleton : 单例类. 3. 模式的简单实现 public class Singleton { private static Singleton intance; private Singleton(

设计模式笔记 Singleton 单例模式

单例模式大概是最直观的一种设计模式了,尽管直观却不简单. 数学与逻辑学中,singleton定义为"有且仅有一个元素的集合", 单例模式可以如下定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供". 我比较喜欢Design Patterns 一书中的描述"保证一个类仅有一个实例,并提供一个访问它的全局访问点". 单例模式的特点 1.单例类只能有一个实例 2.单例类必须自己自己创建自己的唯一实例 3.例类必须给所有其他对象提供这一实例 单

使用设计模式中的单例模式来实现C++的boost库_C 语言

线程安全的单例模式 一.懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety. 使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈. 1.静态成员实例的懒汉模式: class Singleton { private: static Singleton* m_instance; Sing

C# 设计模式系列教程-单例模式_C#教程

1. 描述: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例. 2.2 单例类必须自己创建自己的实例. 2.3 单例类必须为其他对象提供唯一的实例. 3. 实现方式:懒汉单例类和饿汉单例类 3.1 懒汉式单例类 对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返

php设计模式实例之单例模式

单例类: 1.构造函数需要标记为private,单例类不能再其他类中实例化,只能被其自身实例化     2.拥有一个保存类的实例静态成员变量     3.拥有一个访问这个实例的公共的静态方法.[常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到此类是否已经被实例化]     注:需要创建__clone()方法防治对象被复制 作用:     1.php的应用主要用于数据库,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量new操作消耗的资

PHP设计模式之:单例模式的学习笔记

博主最近开始真正的潜心学习PHP的各种设计模式.刚开始当然从一些简单的设计模式开始学起,比如之前发表的工厂模式,今天的单利模式,还有之后要看的注册模式.其实这些都是比较基础的设计模式,一些简单的示例一看就能明白,对于稍加复杂些的示例,花点心思进去也能够理解.可重点是,光是知道了解这么个东西是不够的,而是如何能够把他更好的运用的项目中去,在实践中增加熟练度.好吧,还是说说今天要看的单例模式吧. 一.什么是单例模式? 1.含义: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并

深入解析Java的设计模式编程中单例模式的使用_java

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名.属性.方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见. 4.带下划线的属性或方法代表是静态的. 5.对类图中对象的关系不熟悉的朋友可以参考文章:设计模式中类的关系. 单例模式应该是23种设计模式中最简单的一种模式了.它有以下几个要素: 私有的构

请教大家《设计模式》中单例模式的疑问

问题描述 书中介绍了几种只创建一个类实例的方法,其中第二种是:声明类为final,然后访问其中的静态方法而不用创建类的实例.但是这种方法是可以创建实例的,实在想不通这个方法跟单例模式有什么关系...请问各位这个如何解释? 解决方案 解决方案二:声明为final且将构造函数私有才行.我想我们通常对"单例"的理解是指的经典的getInstance单例模式吧,它这里可能只是讨论几种可能性.解决方案三:需对单例模式做进一步的理解,你可能在理解上有点偏差解决方案四:真不知道LZ在说些啥.<