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 适配器模式(结构型模式)

  • 相关阅读:
    Android 开发转型前端准备知识
    atom写文档技巧
    gerrit升级到16.04之后连接不到服务器
    adb shell am pm
    ArrayList和LinkedList的区别
    Android源码编译
    Android动态加载代码技术
    File 与 FileStream 文件运用
    物体在一定范围自有碰撞
    扫描二维码加载网页图片
  • 原文地址:https://www.cnblogs.com/wangshuo1/p/pattern_6.html
Copyright © 2011-2022 走看看