C++23种设计方式之单例格局

原文:http://www.codeceo.com/article/23-design-parttens-single-partten.html

定义:管教一个类唯有一个实例,而且自行实例化并向整个系统提供这些实例。

类型:成立类方式

类图:

C++ 1

类图知识点:

1.类图分为三有的,依次是类名、属性、方法

2.以<<起初和以>>结尾的为注释音信

3.修饰符+代表public,-代表private,#意味着protected,什么都不曾表示包可知。

4.带下划线的性能或措施表示是静态的。

5.对类图中目标的涉嫌不熟练的恋人可以参考小说:设计方式中类的关系。

单例格局应该是23种设计情势中最简易的一种情势了。它有以下几个元素:

  • 个人的构造方法
  • 针对自己实例的民用静态引用
  • 以温馨实例为重临值的静态的公有的形式

单例形式按照实例化对象时机的不等分为三种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个目标交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码如下:

饿汉式单例

public class Singleton {  
    private static Singleton singleton = new Singleton();  
    private Singleton(){}  
    public static Singleton getInstance(){  
        return singleton;  
    }  
}

懒汉式单例

public class Singleton {  
    private static Singleton singleton;  
    private Singleton(){}  

    public static synchronized Singleton getInstance(){  
        if(singleton==null){  
            singleton = new Singleton();  
        }  
        return singleton;  
    }  
}

单例格局的长处:

  • 在内存中唯有一个目的,节省里存空间。
  • 幸免频仍的创始销毁对象,能够加强性能。
  • 幸免对共享资源的连串占用。
  • 可以全局访问。

适用场景:是因为单例方式的如上优点,所以是编程中用的相比较多的一种设计方式。我总括了瞬间本人所驾驭的契合利用单例情势的情景:

  • 亟待频仍实例化然后销毁的目的。
  • 创造对象时耗时过多照旧耗资源过多,但又平常使用的目的。
  • 有气象的工具类对象。
  • 屡次造访数据库或文件的目的。
  • 以及其余自己没用过的装有必要唯有一个对象的场景。

单例方式注意事项:

  • 只能够选取单例类提供的不二法门赢得单例对象,不要使用反射,否则将会实例化一个新对象。
  • 绝不做断开单例类对象与类中静态引用的安危操作。
  • 多线程使用单例使用共享资源时,注意线程安全问题。

至于java中单例格局的局部争议:

单例格局的目的长日子不用会被jvm垃圾收集器收集吗

观看多如牛毛资料中说:若是一个单例对象在内存中长久不用,会被jvm认为是一个杂质,在履行垃圾收集的时候会被清理掉。对此其一说法,作者持猜疑态度,小编自我的意见是:在hotspot虚拟机1.6本子中,除非人为地断开单例中静态引用到单例对象的联网,否则jvm垃圾收集器是不会回收单例对象的。

对于那一个冲突,作者单独写了一篇小说举办座谈,假设你有例外的眼光仍旧有过那下边的经历请进来小说单例情势切磋篇:单例方式与废物收集参预座谈。

在一个jvm中会现身多个单例吗

在分布式系统、多少个类加载器、以及体系化的的情景下,会时有暴发两个单例,这点是不必置疑的。那么在同一个jvm中,会不会发生单例呢?使用单例提供的getInstance()方法只可以收获同一个单例,除非是运用反射形式,将会取得新的单例。代码如下

Class c = Class.forName(Singleton.class.getName());  
Constructor ct = c.getDeclaredConstructor();  
ct.setAccessible(true);  
Singleton singleton = (Singleton)ct.newInstance();

诸如此类,每一次运行都会发出新的单例对象。所以利用单例格局时,一定留神不要使用反射爆发新的单例对象。

懒汉式单例线程安全吗

关键是网上的有的说法,懒汉式的单例方式是线程不安全的,即使是在实例化对象的法子上加synchronized最紧要字,也照样是危险的,不过作者通过编码测试,发现加synchronized主要字修饰后,尽管对性能有一部分影响,但是却是线程安全的,并不会生出实例化多少个对象的事态。

单例方式唯有饿汉式和懒汉式二种啊

饿汉式单例和懒汉式单例只是两种比较主流和常用的单例情势方法,从理论上讲,任何可以兑现一个类唯有一个实例的设计方式,都得以称为单例格局。

单例类可以被接续吗

饿汉式单例和懒汉式单例由于构造方法是private的,所以他们都是不行再而三的,不过其余过多单例情势是足以继承的,例如登记式单例。

饿汉式单例好照旧懒汉式单例好

在java中,饿汉式单例要优于懒汉式单例。C++中则相似选择懒汉式单例。

单例情势相比简单,在此就不举例代码演示了。