zoukankan      html  css  js  c++  java
  • 设计模式-06 单例模式(创建型模式)

    一 单例模式

      单例模式(Singleton Pattern)提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    主要解决: 一个全局使用的类频繁地创建与销毁。

    关键代码: 构造函数是私有的。

    使用场景:

    Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

    类图 :

    二 实现代码

     将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。SingleObject 类提供了一个静态方法,供外界获取它的静态实例。

    1 创建一个 Singleton 类

    SingleObject.java

    public class SingleObject {
        // 创建 SingleObject 的一个对象
        private static SingleObject instance = new SingleObject();
    
        // 让构造函数为 private,这样该类就不会被实例化
        private SingleObject() {
        }
    
        // 获取唯一可用的对象
        public static SingleObject getInstance() {
            return instance;
        }
    
        public void showMessage() {
            System.out.println("Hello World! , address is :" + this);
        }
    }

    2. 运行测试用例

    SingletonPatternDemo.java

    public class SingletonPatternDemo {
    
        public static void main(String[] args) {
    
            // 不合法的构造函数
            // 编译时错误:构造函数 SingleObject() 是不可见的
            // SingleObject object = new SingleObject();
    
            // 获取唯一可用的对象
            SingleObject object = SingleObject.getInstance();
    
            // 显示消息
            object.showMessage();
        }
    }

       在实际开发中主要采用 双检锁/双重校验锁(DCL,即 double-checked locking)方式实现单例模式

    JDK 版本:JDK1.5 起
    是否 Lazy 初始化:是
    是否多线程安全:是
    实现难度:较复杂
    描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
      getInstance() 的性能对应用程序很关键。
    代码实例:

    public class Singleton {  
        private volatile static Singleton singleton;  
        private Singleton (){}  
        public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
            }  
        }  
        return singleton;  
        }  
    }  

    下一篇 设计模式-07 适配器模式(结构型模式)

  • 相关阅读:
    Nginx 启用gzip压缩
    HTTP压缩的过程
    什么是HTTP压缩及HTTP压缩的过程
    Fiddler抓包工具总结
    HTTP内容编码和HTTP压缩的区别
    LINQ query on a DataTable
    C# Collection for "most recently used"
    Keep timer (setInterval) running while reloading page
    Is there a way to detect if a browser window is not currently active?
    Force Logout users if users are inactive for a certain period of time
  • 原文地址:https://www.cnblogs.com/wangshuo1/p/pattern_6.html
Copyright © 2011-2022 走看看