美文网首页java程序员Android知识
设计模式(二)——单例模式

设计模式(二)——单例模式

作者: l_sivan | 来源:发表于2017-03-22 14:58 被阅读63次

本文属于系列文章《设计模式》,附上文集链接

单例模式定义

  • 确保对象在内存中有且只有一个,并自行实例化为系统提供这个实例。
  • 这个模式在我们只需要一个创建一个对象,避免重复创建对象的时候使用,比如说配置文件,工具类,缓存,线程池,日志对象等等
  • 单例模式属于创建类模式

实现方式一 饿汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    //2、内部调用构造函数创建对象,对象声明为私有属性
    // (饿汉模式的命名由此而来,因为SingleTon对象是static的,在加载SingleTon类的时候,instance对象就会被创建,无论有没有使用该对象,都会创建对象,就像饿汉去餐厅吃饭,无论吃不吃,先点了再说 )
    // final关键字确保该实例对象是内存中有且只有一个
    private final static SingleTon instance = new SingleTon();
    //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

将实例声明为static属性,在类被加载的时候就会创建实例,final属性确保了对象的唯一性。

实现方式二 懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
     //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

这个一般叫做懒汉模式,因为是懒加载嘛,只有对象要被使用的时候才会实例化,但是这里就有一个问题了,假设在多线程的情况下,就会容易会创建多个实例,这不符合单例模式的定义,所以修改下

绝对安全的懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
    // 3 在之前的基础上增加了synchronized关键字和一个instance判空
    public static synchronized SingleTon getInstance(){
        if(instance == null){
            Thread.sleep(1000);
            instance = new SingleTon();
        }
        return instance;
    }

单例模式扩展:指定数量的对象

哈哈,在书上看到的,虽然不知道能不能用上,但是当做活跃下思维吧,觉得挺好玩的。

// 单例类
public class Singleton {
    private Singleton(String name){
        nameList.add(name);
    }
    // 对象的最大个数
    private static int maxNumOfSingleton = 3;
    //定义对象列表
    private static ArrayList<Singleton> singletonList = new ArrayList<Singleton>();
    // 定义对象的名字列表,方便知道是哪个对象
    private static ArrayList<String > nameList = new ArrayList<>();
    //当前对象的序号
    private static int countNum;
    static{
        // 实例化
        for(int i = 1;i<=maxNumOfSingleton;i++){
            singletonList.add(new Singleton(i +"号对象"));
        }
    }
    public static Singleton getInstance(){
        countNum = new Random().nextInt(maxNumOfSingleton);
        return singletonList.get(countNum);
    }
    public void say(){
        System.out.println("我是"+nameList.get(countNum));
    }
}
// 场景
public class Client {
    public static void main(String[] args) {
        for(int i =0;i<5;i++){
            Singleton.getInstance().say();
        }
    }
}
结果:
我是3号对象
我是3号对象
我是1号对象
我是2号对象
我是1号对象

以上就是单例模式

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • Python 面向对象7: 单例模式

    一、内容 1.1、单例设计模式 1.2、__new__方法 1.3、Python 中的单例 二、单例设计模式 2....

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

网友评论

    本文标题:设计模式(二)——单例模式

    本文链接:https://www.haomeiwen.com/subject/shnnnttx.html