设计模式之单利模式

单利模式应该是开发中用的最多的一种。

单例设计模式目的:

解决一个类在内存中只存在一个对象

想要保证对象唯一,实现思路:

1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象

2.还为了其他程序可以访问到该类对象,只好在本类中自定义一个对象

3.为了方便其他程序对自定义对象的访问,可以对外提供访问方式

代码体现:

1.将构造函数私有化

2.在类中创建一个本类对象

3.提供一个方法,可以获取到该对象

方式一:饿汉式

//饿汉式
class Single
{
    private Single(){};
    private static Single s = new Single();
    public static Single getInstance()
    {
        //return new Single();  // 这样其实是每一次都创建一个新对象,不要混淆
        return s;
    }
}

class Test
{
    public static void main(String[] args)
    {
        Single ss = Single.getInstance();
    }
}

方式二 :懒汉式

//懒汉式
class Single
{
    private Single(){};
    private static Single s = null;
    public static Single getInstance()
    {
        if(s == null)
              s = new Single();
         return s;
    }
}
classTest
{
    public static void main(String[] args)
    {
        Single ss = Single.getInstance();
    }
}

小结:

饿汉式:Single一进内存就创建好了对象,

懒汉式:Single进内存还没有存在,只有调用了getInstance方法时才建立对象

懒汉式是延迟加载

懒汉式延迟加载存在的问题: 如果多线程访问时会有线程安全问题

解决方案:

可以加同步来解决,加同步的方式用同步函数和同步代码块都行,但是稍微有些低效

用双重判断的方式能解决低效问题,稍微提高一点

此时同步的时候加的锁是:

该类所属的字节码对象

//懒汉式+多线程
class Single
{
    private Single(){};
    private static Single s = null;
    public static Single getInstance()
    {
        if (s==null)
        {
            synchronized(Single.class)
            {
                if (s==null)
                {
                    s = new Single();
                }
            }
        }
    }
}
class Test
{

    public static void main(String[] args)
    {
        Single ss = Single.getInstance();
        new Thread(ss).start();
        new Thread(ss).start();
    }
}

 

时间: 2024-10-09 04:59:43

设计模式之单利模式的相关文章

《javascript设计模式》读书笔记四(单利模式)

1.单利模式简介 在<设计模式>中单利模式是一种比较简单的模式,定义如下: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组织为一个单元,这个逻辑单元可以通过一个单一的变量访问,确保这个对象只存在一份实例. 单体类在javascript中可以用来划分命名空间.减少网页中全局变量的数目. 小结:其实就是把所有的代码封装到一个类中,访问时就通过这个类访问.好比生活中常见的电视遥控.把所需要的操作都封装到遥控上,访问电视时,直接通过遥控操作即可.

Java设计模式-单利模式

单例模式 作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式有以下特点: 1.单例类只能有一个实例 2.单例类必须自己创建自己的唯一实例 3.单例类必须给其他所有对象提供这一实例 下面看一下单例模式的三种写法,除了这三种写法,静态内部类的方式.静态代码块的方式.enum枚举的方式也都可以,不过异曲同工,这三种方式就不写了. 首先声明就是 在我们项目工程中 我们完全不用使用懒汉式 因为有锁使用的地方就有效率低的存在: 饿汉式

设计模式学习笔记(1)——单利模式

单例模式必须只有一个实例,并且提供一个全局访问方法. 解析经典单利模式实例: 1 package designPatterns; 2 3 public class Singleton { 4 5 //利用一个静态变量来记录类的唯一实例 6 7 private static Singleton uniqueInstance; 8 9 //声明私有构造器,只有本类可以调用该构造器 10 11 private Singleton(){} 12 13 //创建一个静态的方法获取实例对象 14 15 pu

Java设计模式の单利模式

单利模式:确保一个类最多只有一个实例,并提供一个全局访问点. 经典单利模式创建对象代码 public class Singleton { private static Singleton uniqueInstance = null; private Singleton(){ } public static Singleton getInstance(){ if (uniqueInstance==null) { uniqueInstance=new Singleton(); } return un

单利模式的优缺点和使用场景

文章转自:http://www.tools138.com/create/article/20150929/020009847.html 首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

设计模式09-组合模式

1. 概念 有时候又叫做部分-整体模式    存在整体和部分的时候  希望客户端忽略整体和部分的区别 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *=========================

设计模式13-代理模式

1. 概念 代理模式又称为委托模式 :为其他对象提供一种代理以控制对这个对象的访问. 2. 案例 package org.demo.proxy.demo01; public class Demo03 { public static void main(String[] args) { IUser user = new UserProxy(new UserImpl()) ; user.action() ; } } interface IUser{ void action() ; } class U