单例模式(java版)

来源:互联网 发布:商标域名注册服务中心 编辑:程序博客网 时间:2024/06/05 17:41

单例模式


单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。

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

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

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
    -

实现:

单例模式

SingleObject 单例:

package com.DesignPattern.SinglePattern;/** * Created by pc on 2016/9/6. * writer:shunc */public class SingleObject {    //创建 SingleObject    private static SingleObject instance = new SingleObject();    //私有化SingleObject    private SingleObject(){}    //唯一获取 SingleObject 方法    public static SingleObject getInstance(){        return instance;    }    public void showMessage(){        System.out.printf("SingleObject !!!");    }}

单利实现 Dome:

package com.DesignPattern.SinglePattern;/** * Created by pc on 2016/9/6. * writer:shunc */public class SingleObjectDome {    public static void main(String[] args){        SingleObject singleObject = SingleObject.getInstance();        singleObject.showMessage();    }}

单利实现一般有五种写法:

懒汉,饿汉,静态内部类,枚举,双重校验锁

懒汉 单例:

public class SingleObj {    private static SingleObj instance;    private SingleObj (){}    //懒汉,线程安全    public static synchronized SingleObj getInstance() {        if (instance == null) {            instance = new SingleObj();        }        return instance;    }}

饿汉 单利:

public class SingleObject {    private static SingleObject instance = new SingleObject();    private SingleObject(){}    //饿汉    public static SingleObject getInstance(){        return instance;    }}

静态内部类 单例:

public class SingleObj {    private static class SingleObjHolder {        private static final SingleObj INSTANCE = new SingleObj();    }    private SingleObj (){}    //静态内部类    public static SingleObj getInstance() {        return SingleObjHolder.INSTANCE;    }}

枚举 单例:

public enum SingleObj {    INSTANCE;    public void whateverMethod() {    }}

双重校验锁 单例:

public class SingleObj {    private volatile static SingleObj singleobj;    private SingleObj (){}    //双重校验锁    public static SingleObj getSingleObj() {        if (singleobj == null) {            synchronized (SingleObj.class) {                if (singleobj == null) {                    singleobj = new SingleObj();                }            }        }        return singleobj;    }}
0 0
原创粉丝点击