JAVA设计模式——————单例设计模式

4.5 设计模式
Java中有23 种设计模式,本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。

当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择。

1、 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易。

2、 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好。

4.5.1 单例设计模式概念
单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。

单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。

其中单例模式最重要的是确保对象只有一个。

简单来说,保证一个类在内存中的对象就一个。

RunTime就是典型的单例设计,我们通过对RunTime类的分析,一窥究竟。

4.5.2 源码剖析

/**
 * Every Java application has a single instance of class
 * <code>Runtime</code> that allows the application to interface with
 * the environment in which the application is running. The current
 * runtime can be obtained from the <code>getRuntime</code> method.
 * <p>
 * An application cannot create its own instance of this class.
 *
 * @author  unascribed
 * @see     java.lang.Runtime#getRuntime()
 * @since   JDK1.0
 */

RunTime.java
package java.lang;
public class Runtime {
    
    
    //1、创建静态的全局唯一的对象
    private static Runtime currentRuntime = new Runtime();
    //2、私有构造方法,
    /** Don't let anyone else instantiate this class */
    private Runtime() {
    
    }

//3、通过自定义的静态方法获取实例

    public static Runtime getRuntime() {
    
    
        return currentRuntime;
    }
}

4.5.3 饿汉式
目的:控制外界创建对象的个数只能创建1个对象

开发步骤:

1、 私有化构造方法

2、 在类的内部创建好对象

3、 对外界提供一个公共的get(),返回一个已经准备好的对象

class Person{
    
    
    /**
     * 实现单例模式
     *
     * 饿汉式-------简单,框架底层用
     * 1:私有化改造方法 -- 目的就是控制外界创建对象的权利
     * 2:自己new一个给外界准备的对象,且私有化
     * 3:提供一个方法返回自己new的对象给外界用
     */
    /**
     * 因为我是在static方法中去返回的对象,所以我的被返回的成员数据也得是static
     */
    private static Person p = new Person();
    private static Object obj;
    private Person(){
    
    

    }

    /**
     * 加static,getPerson不能通过对象调用,而是只能用类名去调用,避免了很多不必要的麻烦
     * @return 此类对外界共享的,唯一的对象
     */
    public static Person getPerson() {
    
    
        synchronized(obj) {
    
    
            return p;
        }
    }
}

4.5.4 懒汉式

class PersonOne{
    
    
    /**
     * 实现单例模式
     *
     * 懒汉式----按需加载的思想---线程安全的解决方案
     * 1:私有化改造方法 -- 目的就是控制外界创建对象的权利
     * 2:封装创建好的对象 -- 先不创建对象,啥时候用啥时候创建!!
     * 3:提供公的获取对象的方法
     */
    /**
     * 给外界声明一个对象
     */
    private static PersonOne p;

    private PersonOne(){
    
    
    }

    /**
     * 给外界返回p----按需加载
     * @return new好的p对象
     */
    synchronized public static PersonOne getPersonOne(){
    
    
        //静态资源的锁对象必须是类名.class
//        synchronized (PersonOne.class) {
    
    
        //限制若我的p没有被new过就是空的
            if (p == null) {
    
    
                p = new PersonOne();
            }
            return p;
//        }
    }
}

おすすめ

転載: blog.csdn.net/qq_54177999/article/details/116639322