GOF设计模式——Singleton模式

一、什么是Singleton模式?

Singleton模式就是平常所说的单例模式,简单来说就只有一个实例。在使用java.lang.String的时候,将不同的字符串赋给String引用,其实就是创建了一个String对象实例,当有1000个不同的字符串创建的时候,就会出现1000个实例。有时候,我们只想在程序里面创建一个实例,譬如Hibernate的SessionFactory,那么我们可以使用Singleton模式来设计某一个类从始至终,程序调用的都是属于同一个实例。

二、Singleton模式的思想

实现单例的类里面有一个私有的本类对象属性;一个私有的构造方法,说明外面的类不可以通过new的方式来创建该对象;还有一个public的getInstance方法,用于给外面的类调用获取Singleton对象实例。

三、具体实例

实现Singleton模式有多种方式,主要分为两大类:懒汉模式饿汉模式

所谓的懒汉模式,就是比较“懒”,需要调用的时候,才去加载资源(创建实例);饿汉模式就跟懒汉模式相反,在程序启动,类加载的时候就顺便加载实现了。

1、懒汉模式(最常见,也最安全高效)

package com.cjs.Singleton;

public class SingletonLazy {
    private static SingletonLazy singletonLazy;

    private SingletonLazy() {
    }

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

为什么说是最常见,也最安全高效?因为懒汉模式可以合理利用分配资源,而且使用synchronnized锁可以保证创建实例的时候不被其他线程占用。

编写一个Main类,运行一下:

package com.cjs.Singleton;

public class Main {
    public static void main(String[] args) {

        Runnable r = new Runnable() {
            @Override
            public void run() {
               SingletonLazy singletonLazy = SingletonLazy.getInstance();
                System.out.println(singletonLazy.hashCode());
            }
        };
        for (int i = 0; i < 5; i++) {
            try {
                Thread t = new Thread(r);
                t.start();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

输出:

它们的hascode都是一样的值,说明它们获取的实例都是同一个。

2、饿汉模式

饿汉模式实现Singleton模式,有分类好几种:静态生成;静态内之类生成;序列化与反序列化;枚举实现;

他们实现的原理都一样,都是程序启动的时候,就进行加载创建实例。下面举个简单的例子:

package com.cjs.Singleton;

public class SingletonStatic {
    private static class MySingletonStatic{
        private static SingletonStatic singletonStatic = new SingletonStatic();
    }

    private SingletonStatic() {

    }

    public static SingletonStatic getInstance() {
        return MySingletonStatic.singletonStatic;
    }
}

Main类:

package com.cjs.Singleton;

public class Main {
    public static void main(String[] args) {

        Runnable r = new Runnable() {
            @Override
            public void run() {
//               SingletonLazy singletonLazy = SingletonLazy.getInstance();
                SingletonStatic singletonStatic = SingletonStatic.getInstance();
                System.out.println(singletonStatic.hashCode());
            }
        };
        for (int i = 0; i < 5; i++) {
            try {
                Thread t = new Thread(r);
                t.start();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

输出:

原文地址:https://www.cnblogs.com/SysoCjs/p/10327175.html

时间: 2024-10-01 02:32:26

GOF设计模式——Singleton模式的相关文章

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

c++11 改进设计模式 Singleton模式

关于学习 <深入应用c++11>的代码笔记: c++11之前是这么实现的 template<typename T> class Singleton{ public: static T* Instance(){ if (m_pInstance == nullptr) m_pInstance = new T(); return m_pInstance; } template<typename T0> static T* Instance(T0 arg0){ if (m_pI

GOF设计模式——Prototype模式

一.什么是Prototype模式? 在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例.因为有时候对象种类繁多,无法将它们整合到一个类中:或者,生成实例的过程过于复杂,难以根据类生成实例:又或者,想要将类与框架解耦.这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门做一些"复制"的操作. 二.Prototype模式思想 Client负责调用Prototype接口生成实例,

GOF设计模式——Builder模式

一.什么是Builder模式? builder模式,就好比一栋大楼,这栋大楼有很多个组件组成,但是这栋大楼只是一个各个组件结合起来的框架,每一栋大楼都有各自的特色,这些特色由它们实际情况决定.对于程序而言,这栋大楼就好比一个Builder抽象类,里面定义了很多组件方法,一个完整的功能离不开里面的每一个方法,具体实现依赖子类,只要继承这个抽象类,就可以根据组件方法组建起自己的"大楼". 二.Builder模式思想 Builder类:负责生成实例的接口,里面定义了用于生成实例的方法: Co

跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类 从目的来看: 创建型模式:负责对象创建 结构性模式:处理类与对象间的组合 行为型模式:类与对象交互中的职责分配 从范围来看: 类模式处理类与子类的静态关系 对象模式处理对象间的动态关系 动机 在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任. 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author

Gof 设计模式 、MVC 编程模式

主题: Gof 设计模式 .MVC 设计模式 名词解释: OOP  (面向对象程序设计) 接口 抽象类 Refactoring(重构方法) GoF(Gang of Four),中文名——四人组.GoF是一种设计模式. via http://baike.so.com/doc/176639.html Model–view–controller (MVC) via http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 有力

GOF设计模式以外的经典模式

除了23种设计模式,还有许多常见的设计模式. 1.简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.

GoF设计模式三作者15年后再谈模式

Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85,000 iPhone的小应用遍布全球,使用PHP就能够写一个简单的"Hello, World! The time is X"Web网页,那么,面向对象设计是难的,这句话是否还正确呢? Richard Helm: 软件设计总是很难的,尽管大多数现代开发环境已经降低了复杂性,通过重用库和工具