菜单

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

2019年1月28日 - Java
单利模式的核心点在于只能生成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');

分类

  Java语言的风味使得在Java中落实单例形式经常有二种表现情势:

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

单例形式的欠缺

  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…

  懒汉式单例类

  懒汉式单例类与饿汉式单例类相同的是,类的构造函数是个体的;不一致的是,懒汉式单例类在加载时不会将自己实例化,而是在首先次被调用时将协调实例化。

  懒汉式代码如下:

 

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.单例方式可以在系统安装全局访问点,优化和共享资源访问。

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

  饿汉式单例类

  饿汉式代码如下:

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

     
上边那段代码中,在类加载时,静态变量m_instance会被起先化,此时类的个体构造函数会被调用,单例类的绝无仅有实例就被创制出来。单例类中最要害的特征是类的构造函数是私家的,从而幸免外界利用构造函数直接创设出任意多的实例。别的,构造函数是私有的,由此该类不可能被接续。

定义

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

  单例形式的关键功效是保障一个类唯有一个实例存在。单例情势可以用在成立目录,数据库连接等须要单线程操作的场面,用于落实对系统资源的主宰。

相关文章

发表评论

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

网站地图xml地图