资讯专栏INFORMATION COLUMN

开发之路(设计模式五:单件模式)

Steven / 1562人阅读

摘要:单件模式提供这个实例的全局访问点。实现单件模式,需要私有构造器,一个静态方法,一个静态变量。设计到多线程问题,同步会降低程序效率。

拥有独立且唯一的对象

这次讲述的是单件模式,就是整个内容里只有一个实例化“唯一”对象。这么说可能有点拗口,这么说吧,比方说,线程池,缓存,注册表,日志文件,甚至做JDBC中连接,关闭,增删改查数据库的Connection类(个人命名也许并不一样)、工具类等等。这些东西往往是要实例一次,就能在整个项目中使用了。

单件模式并不难理解定义如下
单件模式:确保一个类中只有一个实例,并提供一个全局访问点。
是的就这么一句话的定义。一般单件模式分为“懒汉式”和“饿汉式”做法

直接上代码。

“懒汉式”做法

package singleton01;

public class Singleton01 {
    // 利用一个静态变量记录本类当中唯一的实例(mySingleton01)
    private  static Singleton01 mySingleton01 = null;

    public Singleton01() {
    }

    // synchronized关键字:线程同步锁,在多线程中去互斥地访问临界资源
    // 迫使每个线程在进入方法之前,要先等别的线程执行完离开方法后才能执行,达到多个线程排队,不会造成有多个线程同时进入这个方法
    // 即是同步。但同步会使程序效率降低
    public static synchronized Singleton01 getInstance() {
        if (mySingleton01 == null) {
            mySingleton01 = new Singleton01();
            System.out.println("Singleton01被实例化了");
        }
        System.out.println("返回Singleton01实例");
        return mySingleton01;
    }
    /**
     * 上面方法就是常说了“懒汉式”做法,大体意思就是当谁需要类方法时采取实例化
     */
}
package singleton01;

public class TestMain {
    public static void main(String[] args) {
        // 打印出前两行结果
        Singleton01 singleton01 = Singleton01.getInstance();

        // 此时我们看到第二次调用类方法时候,没有去实例对象
        // 这里涉及并发方面问题,暂时没学习并发,具体怎么个原理我也不知道...
        Singleton01 singleton02 = Singleton01.getInstance();
    }
}

效果图1

效果图2

之前的做法中我们用到了synchronized,就是为了防止线程启动的随机性找出变量混乱,我这个小例子可能看不出来什么。但实际上同步线程(synchronized)会使得程序效率大幅降低。利用双重检查加锁可以有效解决此问题,

使用双重检查加锁

package singleton01;

public class singleton02 {
    // 利用双重检查加锁,先检查实例是否已经创建,如果没创建,就进行同步。
    // volatile:instance变量被初始化singleton02实例时,多个线程会正确处理instance变量
    // 线程是具有随机性的,与程序执行顺序无关。
    private volatile static singleton02 instance=null;

    public singleton02() {        
    }

    public static singleton02 getInstance() {
        if (instance == null) {
            // 检查实例,不存在的话进入同步区域,只有第一次才执行这里
            synchronized (singleton02.class) {
                System.out.println("进入同步区域");
                if (instance == null) {
                    System.out.println("instance被实例化了");
                    instance = new singleton02();
                }
            }
        }
        System.out.println("返回instance实例");
        return instance;
    }
}
package singleton01;

public class TestMain02 {
    public static void main(String[] args) {
        //第一次进入方法会进入同步区实例化
        singleton02 singleton02 = null;
        singleton02 = singleton02.getInstance();
        
        //当第二次进入时,已有实例,不会同步了,直接返回实例.
        singleton02 singleton03 = null;
        singleton03 = singleton02.getInstance();    
    }

}

效果图

"饿汉式"做法

package singleton02;

public class Singleton {
    /**
     * “饿汉式”:加载这个类时立刻创建本类中唯一的单件实例,
     */
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
        System.out.println("返回实例实例");
        return uniqueInstance;
    }
}
package singleton02;

public class TestMain {
    public static void main(String[] args) {
        //直接返回实例
        Singleton singleton = Singleton.getInstance();
    }
}

效果图

注:双重检查加锁不适用与1.4之前的java版本。

要点:
1、单件模式确保程序中一个类最多只有一个实例。
2、单件模式提供这个实例的全局访问点。
3、实现单件模式,需要私有构造器,一个静态方法,一个静态变量。
4、设计到多线程问题,同步会降低程序效率。

感谢你看到这里,至此单件模式内容结束,本人文笔随便,若有不足或错误之处望给予指点,90度弯腰~~~很快我会发布下一个设计模式内容,生命不息,编程不止!

参考书籍:《Head First 设计模式》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70259.html

相关文章

  • 设计模式——单件模式

    摘要:简介单件模式也叫单例模式,是一种创建型模式。类图中类变量持有唯一的单件实例,是静态方法,可以通过类名在任何需要的地方使用它,与访问全局变量一样,但是可以延迟实例化。 1. 简介   单件模式(Singleton)也叫单例模式,是一种创建型模式。它确保一个类只有一个实例,并提供全局访问。 2. UML类图 showImg(https://segmentfault.com/img/bVb...

    testHs 评论0 收藏0
  • 夕阳下, 那是我在奔跑——单件模式

    摘要:急切的創建對象饿汉式以上爲饿汉式單列設計,該設計是線程安全的,即不同的線程在調用時返回的是統一對象,在加載這個類時,馬上創建了這個類的唯一單列實列。 單件模式(JAVA實現) 定義 單件模式: 確保一個類只有一個實列, 並提供一個全局訪問點 單件模式和全局變量的區別 若將對象賦值給一個全局變量, 則該對象需在程序開始時就創建好, 而改對象可能不會使用, 造成資源浪費, 而單件模式支持...

    lieeps 评论0 收藏0
  • 常见设计模式的定义,应用场景和方法

    摘要:命令模式的由来,其实是回调函数的一个面向对象的替代品,命令模式早已融入到了语言之中。 模式是对某情景下,针对某种问题的某种解决方案。而一个设计模式是用来解决一个经常出现的设计问题的经验方法。这么说来,每个模式都可能有着自己的意图,应用场景,使用方法和使用后果。本文的行文思路和目的皆在于了解各个模式的定义,应用场景和用实例说明如何在前端开发中使用。 本文所设计到的概念和实例大多来自《H...

    xuxueli 评论0 收藏0

发表评论

0条评论

Steven

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<