cnfox

Java 单例设计模式
前言 单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实...
扫描右侧二维码阅读全文
02
2019/09

Java 单例设计模式

前言

 单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例.这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

准备

 在讲单例设计模式之前,我们先简单了解下那什么是设计模式?
 说的通俗一点:设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
 这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。
 当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择:

  • 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易;
  • 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好

 感兴趣想要拜读这这本书的童鞋,在这里我也贴一下这本书的下载链接(不是百度云盘,速度贼快),评论后可见哦~ (づ ̄3 ̄)づ╭❤~

此处内容需要评论回复后(审核通过)方可阅读。

关于本文章

 本文章虽然命名为“Java 单例设计模式”,但是设计模式并不是 Java 的专利,它同样适用于 C++、C#、JavaScript 等其它面向对象的编程语言。
 本人能力有限,这一篇文章是自己在查阅很多资料后,结合自己的理解前提下整理的,本意在以最容易理解的言语去单例设计模式,有表述不当或遗漏之处还望大家在评论区斧正.
 Java 是典型的面向对象的编程语言,所以本文章以 Java 为基础来讲解单例设计模式,如果你不了解 Java,请猛击[我的Hexo静态博客][1]学习。

解决的问题

 解决一个类在内存只存在一个对象。

如何保证对象唯一

思路

  1. 为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
  2. 还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
  3. 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

这三部怎么用代码体现呢?(思路、代码体现、代码是一一对应的)

  • 将构造函数私有化(这样就不能在外部new对象了,而且仅仅提供get方法访问对象)。
  • 在类中创建一个本类对象(静态私有)。
  • 提供一个方法可以获取到该对象(公共私有)。

单例设计模式的分类

  • 饿汉单例模式:静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例模式。不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”)
  • 懒汉单例模式:要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例模式。(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”)

代码简单实现饿汉式

package cn.icnfox.Java;

public class SingleDemo {

    private int num;
    
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
        //私有化构造函数
    private  SingleDemo(){}
        //创建对象
    private static SingleDemo s = new SingleDemo();
        //静态方法返回该实例
    public static  SingleDemo getInstance()
    {
        return s;
    }
}
package cn.icnfox.Java;
//测试类
public class SingleTest {

    public static void main(String[] args) {
        
        SingleDemo s1 = SingleDemo.getInstance();
        SingleDemo s2 = SingleDemo.getInstance();

        s1.setNum(23);

        System.out.println(s2.getNum());

    }
}
//运行结果
23

简单实现懒汉式

package cn.icnfox.Java;
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
//定义单例,建议使用饿汉式。
public class SingleDemo2 {

    private int num;
    
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
        //创建对象
    private static SingleDemo2 s = null;
        //私有化构造函数
    private SingleDemo2(){}
        //静态方法返回该实例
    public static SingleDemo2 getInstance()
    {
        if(s==null)
        {
            synchronized(SingleDemo2.class)
            {                
                if(s==null)
                    s = new SingleDemo2();
            }
        }
        return s;
    }
}

package cn.icnfox.Java;
//测试类
public class SingleTest {

    public static void main(String[] args) {
        
        SingleDemo s1 = SingleDemo.getInstance();
        SingleDemo s2 = SingleDemo.getInstance();

        s1.setNum(23);

        System.out.println(s2.getNum());

    }
}
//运行结果
23

简单实现线程安全的饿汉式

package cn.icnfox.Java;
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
//定义单例,建议使用饿汉式。
public class SingleDemo2 {

    private int num;
    
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    private static SingleDemo2 s = null;
    private SingleDemo2(){}
    // 静态方法返回该实例,加synchronized关键字实现同步
    public static synchronized  SingleDemo2 getInstance()
    {
        if(s==null)
        {
            synchronized(SingleDemo2.class)
            {                
                if(s==null)
                    s = new SingleDemo2();
            }
        }
        return s;
    }
}

Last modification:September 8th, 2019 at 05:28 pm
如果觉得我的文章对你有用,请随意赞赏

One comment

  1. Pinocchio Google Chrome 76.0.3809.132 Windows 10 美国 美国

    Good!

Leave a Comment