炒冷饭系列:设计模式 单例模式

一、什么是单例模式

单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象。也就是说, 在整个程序空间中,该类只存在一个实例对象。 其实,GoF对单例模式的定义是:保证一个类、 只有一个实例存在,同时提供能对该实例加以访 问的全局访问方法。

二、为什么要使用单例模式呢?

在应用系统开发中,我们常常有以下需求:

  • - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象
  • - 在整个程序空间使用全局变量,共享资源
  • - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

因为Singleton模式可以保证为一个类只生成唯一的实例 对象,所以这些情况,Singleton模式就派上用场了。

三、单例模式实现

1.饿汉式。

public class Person {
    public static final Person person = new Person();
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //构造函数私有化
    private Person() {
    }

    //提供一个全局的静态方法
    public static Person getPerson() {
        return person;
    }
}

2.懒汉式。

public class Person2 {
    private String name;
    private static Person2 person;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //构造函数私有化
    private Person2() {
    }

    //提供一个全局的静态方法
    public static Person2 getPerson() {
        if(person == null) {
            person = new Person2();
        }
        return person;
    }
}

3.双重检查。

public class Person3 {
    private String name;
    private static Person3 person;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //构造函数私有化
    private Person3() {
    }

    //提供一个全局的静态方法,使用同步方法
    public static synchronized Person3 getPerson() {
        if(person == null) {
            person = new Person3();
        }
        return person;
    }
}
public class Person4 {
    private String name;
    private static Person4 person;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //构造函数私有化
    private Person4() {
    }

    //提供一个全局的静态方法
    public static Person4 getPerson() {
        if(person == null) {
            synchronized (Person4.class) {
                if(person == null) {
                    person = new Person4();
                }
            }
        }
        return person;
    }
}

MainClass:

public class MainClass {
    public static void main(String[] args) {
        Person2 per = Person2.getPerson();
        Person2 per2 = Person2.getPerson();
        per.setName("zhangsan");
        per2.setName("lisi");

        System.out.println(per.getName());
        System.out.println(per2.getName());
    }
}
时间: 2024-11-08 20:26:10

炒冷饭系列:设计模式 单例模式的相关文章

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

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

学习JavaScript设计模式(单例模式)_javascript技巧

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的用途同样非常广泛.试想一下,当我们单击登录按钮的时候,页面中会出现一个登录框,而这个浮窗是唯一的,无论单击多少次登录按钮,这个浮窗只会被创建一次.因此这个登录浮窗就适合用单例模式. 1.单例模式的使用场景 在使用一种模式之前,我们最好要知道,这种模式的使用场景.用了这么久的单例模式,竟全然不知!用它

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

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

炒冷饭系列:设计模式 工厂方法模式

一.什么是工厂方法模式 工厂方法模式同样属于类的创建型模式又被称 为多态工厂模式 .工厂方法模式的意义是定义一个创建 产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核心类成为一个 抽象工厂角色,仅负责具体工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品. 二.模式中包含的角色及其职责 1.抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口. 2.具体工厂(

炒冷饭系列:设计模式 抽象工厂模式

一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端 提供一个接口,使得客户端在不必指定产品的具 体类型的情况下,能够创建多个产品族的产品对象. 产品族和产品等级结构. 二.模式中包含的角色及其职责 1.抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口. 2.具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象. 3.抽象

炒冷饭系列:设计模式 工厂模式

一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口. 3.具体产品(Concrete Product)角色 简单工厂模式所创

炒冷饭系列:设计模式 装饰模式

一.什么是抽象工厂模式 装饰( Decorator )模式又叫做包装模式.通 过一种对客户端透明的方式来扩展对象的功能, 是继承关系的一个替换方案. 二.装饰模式的结构 角色和职责 以下是对此图的见解,不服别喷.Component是实体接口 或者 抽象类.左边的ConcreteComponent是其实现(功能).Decorator装饰,所谓的装饰抽象类就是把接口类实现,然后加上DoSomething的模块. 然后下面就是各个对具体装饰的实现,如果需要多功能结合 不是相互结合,而是通过父类抽象结合

PHP设计模式——单例模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.        单例模式也称单态,是23种设计模式中最简单的一种,从他的名字就可以知道他的核心思想,单例模式就是系统中只有一个这样的对象,对象只有一个,在Java或者C#中,单例模式一般有两种,分别是懒汉式.饿汉式,但是在PHP中常用的就是懒汉式,由于PHP是单线程的,懒汉式也不存在双重验证.         懒汉式具体代码:         <?php /** * Created by PhpStorm. * User: LYL *

JS设计模式 单例模式 模块模式

关于设计模式 先说说什么是设计模式吧.很多人都觉得"设计模式"这东西很玄乎,把Gof四人帮的<Design Patterns>奉为编程圣经,而我却觉得大可不必.设计模式说白了,就是在特定环境下解决某类常见问题的一种套路,按着这种套路去做就会很得心应手.但是,这并不代表这些设计模式是放之四海皆准,更不是说套着设计模式做的东西就一定是最好维护.性能最佳.至高无上的了.就算你不知道什么设计模式,只要思路正确,也能写出设计模式来. 有大师说,设计模式其实是对语言缺陷的一种弥补.这里