菜单

设计方式-单例情势(02),设计格局例格局02

2019年1月25日 - Php
单利模式的核心点在于只能生成1个对象,并且是由类中的静态变量保存。

以下代码来自《深入PHP 面向对象、模式与实践》(第三版)第9章

/**
 * Created by PhpStorm.
 * User: Eilen
 * Date: 2018/8/31
 * Time: 22:48
 */

class Preferences
{
    private $props = array();
    private static $instance;

    private function __construct(){}

    /**
     * 获取单例模式对象
     * @return mixed
     */
    public static function getInstance()
    {
        if (empty(self::$instance)){
            self::$instance = new Preferences();
        }
        return self::$instance;
    }

    /**
     * 接收对象的参数,并且赋值
     * @param $key
     * @param $val
     */
    public function setProperty($key, $val)
    {
        $this->props[$key] = $val;
    }

    public function getProperty($key)
    {
        return $this->props[$key];
    }
}

//引用单例模式

$pref = Preferences::getInstance();
$pref->setProperty('name', 'matt');

unset($pref);

$pref2 = Preferences::getInstance();
print $pref2->getProperty('name');

设计方式-单例形式(02),设计格局例情势02

定义

  单例格局(Singleton Pattern)是最简便易行的一种设计形式。
  英文原话是:Ensure a class has only one instance,and provide a
global point of access to it.
  意思是:确保一个类只有一个实例,而且自动实例化并向全方位连串提供那一个实例。

  单例方式的主要功用是有限支持一个类唯有一个实例存在。单例情势可以用在确立目录,数据库连接等急需单线程操作的场面,用于落到实处对系统资源的控制。

分类

  Java语言的特点使得在Java中贯彻单例格局日常有三种表现方式:

  饿汉式单例类:类加载时,就展开对象实例化。
  懒汉式单例类:第一遍引用类时,才开展对象实例化。

  饿汉式单例类

  饿汉式代码如下:

public class Singleton{
    private static Singleton m_instance = new Singleton();
    //构造方法私有,保证外界无法直接实例化
    private Singleton(){
    }
    //通过该方法获得实例对象
    public static Singleton getInstance(){
        return m_instance;
    }        
}

     
下面那段代码中,在类加载时,静态变量m_instance会被开首化,此时类的个体构造函数会被调用,单例类的唯一实例就被成立出来。单例类中最要紧的性状是类的构造函数是私房的,从而防止外界利用构造函数直接开立出任意多的实例。别的,构造函数是个人的,因而该类不可能被接二连三。

  懒汉式单例类

  懒汉式单例类与饿汉式单例类相同的是,类的构造函数是个体的;差其余是,懒汉式单例类在加载时不会将团结实例化,而是在第三遍被调用时将自己实例化。

  懒汉式代码如下:

 

public class Singleton{
    private static Singleton _instance = null;
    //构造方法私有,保证外界无法直接实例化
    private Singleton(){
    }    
    //方法同步
    synchronized public static Singleton getInstance(){
        if(_instance==null){
            _instance = new  Singleton();
        }
        return _instance;
    }
}

  下面那段代码中,懒汉式单例类中对静态方法getInstance()举办同步,以有限辅助八线程环境下只开创一个实例。例如:假使getInstance()方法未被同步,并且线程A和线程B同时调用此措施,则执行if(_instance==null)语句时都为真,线程A和线程B会独家创立一个目标,在内存中就会产出多个对象,那样就违反了单例形式;单运用synchronized关键字展开联合后,就不会油可是生那种气象了。

  饿汉式单例类与懒汉式单例类之间的区别

  1.懒汉式单例类在被加载时实例化,而懒汉式单例类在第四回引用时实例化。
  2.从资源使用上说,饿汉式单例类比懒汉式单例类要差点(因为饿汉式一开首就会实例化一个目的占用系统资源),但从速度和反应时间角度来讲,则饿汉式单例类比懒汉式单例类好一些。

  3.饿汉式单例类可以在Java中贯彻,但科学在C++中落到实处。GoF在提出单利情势的概念是举的事例是懒汉式的,他们的书影响较大,以至于Java中单例类的例证大多是懒汉式的。实际上,饿汉式单例类更合乎Java语言本身的特征。

单例对象的独到之处

  1.是因为单例方式在内存中唯有一个实例,减弱了内存的支出,更加是当一个目的急需频仍地被成立、销毁而且创造或销毁的性能又不可能优化时,单例情势的优势就极度分明。
  2.是因为单例形式值生成一个实例,所以减弱了系统的习性成本,当一个对象的发生须求相比多的资源时,如读取配置文件、发生其余依赖对象时,可以在启动时直接发生一个单例对象,然后永久驻留内存的措施来缓解。
  3.单例情势可以避免对资源的文山会海占用。例如:一个写文件动作,由于唯有一个实例存在于内存中,幸免了对同一个资源文件的还要写操作。
    4.单例情势可以在系统安装全局访问点,优化和共享资源访问。

单例形式的症结

  1.单例形式无法创设子类,且伸张困难。若要扩大,除了修改代码以外基本上并未第三种途径得以兑现。
  2.单例方式对测试不利。在相互开发环境中,倘诺应用单例情势的类没有落成,程序是无法进行测试的;单例形式的类一般不会兑现接口,那也妨碍了接纳mock的方法虚拟一个对象。
  3.单例形式与单一义务规范有争执。一个类应该只兑现一个逻辑,而不关怀它是或不是是单例的,是不是利用单例形式取决于环境,单例情势。

单例形式的施用情状

  在一个种类中,如果要求一个类有且仅有一个实例,当出现多少个实例时就会招致不良反应,则此时得以应用单例情势。典型气象如下:

  1.须求转变唯一体系号的条件。
  2.在任何项目中需求一个访问点或共享数据。(如web页面上的计数器)
  3.创制一个目的急需费用的资源过多,如访问IO和数据库等资源。
  4.急需定义多量的静态常量和静态方法(如工具类)的环境,可以使用单例情势。

那是一个误导人的线程例子,经过改动后.就变得很不难.

public class CounterSingleton {
    //懒汉式加载
    private static CounterSingleton singleton = new CounterSingleton();
    //私有构造,防止生成对象
    private CounterSingleton() {
    }
    //获取类
    public static CounterSingleton getInstance() {
        return singleton;
    }
    //对象的私有变量
    public int count = 0;
    //懒汉式对象的方法
    public synchronized void inc() {        
        //加访问量
        count++;
        //System.out.println(count);
    }

      public int getCount() {
        return count;
      }

}

public class Counter {
    public static void main(String[] args) {
        long time_s=System.currentTimeMillis();
        //同时启动1000个线程,去进行i++计算,看看实际结果
        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    CounterSingleton.getInstance().inc();
                }
            }).start();
        }

        //这里每次运行的值都有可能不同,显示结果可能不为1000(inc方法没有sychonized的话,count就是真的不是1000了)
        System.out.println("运行结果:CounterSingleton.count=" + CounterSingleton.getInstance().getCount());
        System.out.println("耗时:"+(System.currentTimeMillis()-time_s));
    }
}

源码

http://www.bkjia.com/Javabc/1232484.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1232484.htmlTechArticle设计模式-单例模式(02),设计模式例模式02 定义
单例情势(Singleton Pattern)是最简便易行的一种设计格局。 英文原话是:Ensure
a class has only one…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图