13 设计模式

单例设计模式

  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。 这样的模式有几个好处: 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 省去了new操作符,降低了系统内存的使用频率,减轻GC(垃圾回收机制)压力。 有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

  首先我们写一个简单的单例类: 我们如果保证类在内存中只有一个对象呢?

    1:为了控制该类对象的建立,不让其他的类创建该类的对象.

    2:在本类中应该提供一个本类对象.

    3:提供公共的方式供别人访问这个对象.

  代码如何实现呢?

    1、构造函数私有化,防止其他类创建该类对象

    2、在本类中,通过new关键字创建一个对象

    3、提供一个public方法,对外访问

package singletonPattern;
//饿汉式,拿来就用
public class SingletonPatternDemo {
    private String name;
    private int age;
    //2、在本类中,通过new关键字创建一个对象
    private static SingletonPatternDemo spd = new SingletonPatternDemo();
    //1.构造函数私有化,防止其他类创建该对象
    private SingletonPatternDemo(){
        super();
    }
    //3、提供一个public方法,对外访问
    //为了其他人 通过类名调用,所以static
    public static SingletonPatternDemo getSingletonPatternDemo(){
        return spd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
package singletonPattern;
//饱汉式  拿来以后先比对一下,然后再决定用不用,注意线程问题
public class SingletonPatternTest {
    private String name;
    private int age;
    static //2、在本类中,通过new关键字创建一个对象让类加载时先不创建对象
    SingletonPatternTest spt = null;
    //1.构造函数私有化,防止其他类创建该对象
    private SingletonPatternTest(){
        super();
    }
    //3、提供一个public方法,对外访问
    //为了其他人 通过类名调用,所以static
    /*注意饱汉式可能会出现多线程的问题,当一个线程调用此方法执行到if判断完,并返回true,然后线程被挂了起来,此时另一个线程进来
     * 判断然后返回true,依次进行,new对象,此时堆中已经存在一个单例对象,被挂起来那个线程再进来,再new对象,此时会出现并发的问题,JVM中就可能出现多个对象
     * 怎么避免这种情况出现呢,同步机制,使用同步方法
     * */
    public static synchronized SingletonPatternTest getSingletonPatternTest(){
        if(spt == null){
            spt = new SingletonPatternTest();
        }
        return spt;
    }
}
package singletonPattern;
/*
 * 首先我们写一个简单的单例类:
    我们如果保证类在内存中只有一个对象呢?
    1:为了控制该类对象的建立,不让其他的类创建该类的对象.
    2:在本类中应该提供一个本类对象.
    3:提供公共的方式供别人访问这个对象.

    代码如何实现呢?
    1、构造函数私有化,防止其他类创建该类对象
    2、在本类中,通过new关键字创建一个对象
    3、提供一个public方法,对外访问

 */
public class SingletonTestClass {
    public static void main(String[] args) {
        //创建单例对象
        SingletonPatternDemo psd1 = SingletonPatternDemo.getSingletonPatternDemo();
        SingletonPatternDemo psd2 = SingletonPatternDemo.getSingletonPatternDemo();
        SingletonPatternDemo psd3 = SingletonPatternDemo.getSingletonPatternDemo();
        //比较获取的三个对象是不是同一个对象
        if((psd1==psd2)&&(psd2==psd3)){
            System.out.println("单例模式是在JVM中只创建一个对象!");
        }else {
            System.out.println("单例失败!");
        }
        //饱汉式创建单例对象
        SingletonPatternTest spt1 = SingletonPatternTest.getSingletonPatternTest();
        SingletonPatternTest spt2 = SingletonPatternTest.getSingletonPatternTest();
        SingletonPatternTest spt3 = SingletonPatternTest.getSingletonPatternTest();
        if((spt1==spt2)&&(spt2==spt3)){
            System.out.println("单例模式是在JVM中只创建一个对象!");
        }else {
            System.out.println("单例失败!");
        }
    }
}

两种单例设计模式的区别?

  第一种(饿汉式):对象随着类的加载而创建

  第二种(懒汉式):需要使用的时候,再创造对象,以后使用的是同一个对象。

使用场合:

  工作的时候: 第一种

  面试的时候: 第二种 原因: 第二种,会出现线程安全问题

时间: 2024-11-06 17:01:15

13 设计模式的相关文章

13.设计模式_代理模式

一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象,然后客户端只需要访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,这样的一个解决思路就是今天要介绍的代理模式. 二.代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

设计模式——6大设计原则

1.单一职责原则 单一职责原则的英文名称是Single Responsibility Principle,简称是SRP. 单一职责的定义是:有且仅有一个原因引起类的变更. 单一职责原则要求一个接口或者一个类只有一个原因引起变化,也就是说一个接口或类只有一个职责,它就负责一件事情. 建议是:接口一定要做到单一职责,类的世界尽量做到只有一个原因引起变化.2.里氏替换原则 里氏替换原则的英文名称是Liskov Substitution Principle,简称是LSP. 里氏替换原则的定义:所有引用基

Android开发工程师,新长征路上的14项技能

导读: 你曾渴望回到宋朝吗? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一起,那时的你,生活的简单而美好. 看看现在的你,一个刚入门的安卓开发工程师,没有信用卡,没有她,没有24小时热水的家.你想念你的锄头和翠姑(或麦垛),可你回不去了,你现在手中的安卓手机,冰冷如铁,你不知道如何在这4寸屏的小东西上打出一片天地. 你不用感到不知所措和困惑,技术就是你安身立命的根本,当下,你的

Android开发工程师,前行路上的14项技能

导读: 你是否曾渴望回到宋朝? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有现在这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一起,那时的你,生活的简单而美好. 看看现在的你,一个刚入门的安卓开发工程师,没有信用卡,没有她,没有24小时热水的家.你想念你的锄头和翠姑(或麦垛),可你回不去了.你握在手中的安卓手机,冰冷如铁,你不知道如何在这4寸屏的小东西上创出一片天地. 你不用感到不知所措和困惑,技术就是你安身立命的根本,当下

文章归档

01 Java 基础语法 Java基础语法<一> 数据类型&运算符 Java基础语法<二> 字符串String 编辑 Java基础语法<三> 输入输出 编辑 Java基础语法<四> 控制流程  编辑 Java基础语法<五> 大数值BigInteger BigDecimal  编辑 Java基础语法<六> 数组 Arrays 编辑 Java基础语法<七> 对象与类 封装          编辑 Java基础语法<

Android开发project师,前行路上的14项技能

导读: 你是否曾渴望回到宋朝? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有如今这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一起,那时的你,生活的简单而美好. 看看如今的你,一个刚入门的安卓开发project师,没有信用卡,没有她,没有24小时热水的家.你想念你的锄头和翠姑(或麦垛),可你回不去了.你握在手中的安卓手机,冰冷如铁,你不知道怎样在这4寸屏的小东西上创出一片天地. 你不用感到不知所措和困惑,技术就是你安身立命的

Java面试要点整理

1.      Java的GC的理解 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerv

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122