单例模式 俗称单例3步曲+1曲

什么是单例模式?
    在整个应用中通过这个类只能实例化一个对象实例的设计模式

模式分类?

在所有模式设计中,有三种基础设计模式,单例模式,工厂模式,注册树模式,其他模式往往基于这几种模式,今天带来的是单例模式。

为什么要用单例模式?
    1。php常常和数据库打交道,如果在应用中频繁建立连接对象,进行new操作的话,会消耗大量的系统内存资源。(节省资源开销)
    2。在团队合作项目中,单例模式可以有效避免不同程序员new自己的对象时,造成人为的系统消耗。(节省资源开销)

 ------------------实现单例3部曲+1曲------------------

第一步:封装构造方法  private  __construct( ) { }
             原因:   构造函数在 new 出对象的时候第一个调用的方法  构造函数被申明为private或者protected这注定无法通过new的方法创建实例对象了。

第二步:   通过类内的方法来创建对象实例。   static Single(){ }
           原因:我们往往往往是创建了对象后才调用对象的方法,而此时需要调用类里面的方法来创建对象。不受是否创建对象影响都能调用的方法的解决方案毋庸置疑那就是利用关键字--static

第三步:定义一个封装的静态变量    private static $instance
           原因:把实例化的唯一对象放在这个变量里面存起来
            
第四步(加1曲):私有化克隆的魔术方法:__c l o n e ();
            原因:对于一个类的对象,如果使用“clone运算符”,就会克隆出一个跟当前对象完全一样的新对象出来,并且:此时这个新对象还会自动调用该类中的魔术方法:_ _c l o n e ();只要其中有该方法;

代码演示

<?php

class Sing {

    //第三步:定义一个变量
    private static $instance= null;

    //第一步:封装构造函数
    private function  __construct(){

    }

    //第二步:使用类名调用这个类创建对象实例
    static  function getSingle(){
        if( !(self::$instance  instanceof self) ){	//instanceof判断一个对象是否是某个类的实例
	    self::$instance = new self();               //用变量来存储实例化出来的对象
	}
	    return self::$instance;
    }

    //第四步:禁止克隆实例化出来的对象
    private function __clone(){ }

}

 $danli = Sing::getSingle();
 var_dump($danli);    //输出   object(Sing)#1 (0) { }
 $danli2 = Sing::getSingle();
 var_dump($danli2);   //输出   object(Sing)#1 (0) { }

$obj3 = clone $danli;   //此处禁止克隆单例对象实例
var_dump($obj3);  //Call to private Sing::__clone() from context ‘‘ in 错误行号

?>
时间: 2024-12-29 04:44:40

单例模式 俗称单例3步曲+1曲的相关文章

C++单例模式与单例类模板

1.单例模式 (1)需求的提出:在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(Single,Instance) (2)问题:如何定义一个类,使得这个类最多只能创建一个对象? 要控制类的对象数目,必须对外隐藏构造函数 思路: @1:将构造函数的访问属性设置为private,将拷贝构造函数,赋值操作符都声明成private的,防止对象的赋值操作,因为这个类的对象只能有一个. @2:定义instance并初始化为NULL.在类中用static type* instance的方式声明一

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat

GOF设计模式之1:单例设计模式

1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单例模式,因为数据库连接是一种数据库资源 操作系统的文件管理系统,也是单例模式,一个操作系统只能有一个文件系统 Application也是单例的应用(Servlet编程或者Android的Application类) 在Spring中,每个bean默认也是单例的,这样的有点儿事Spring容器可以管理

【Java】设计模型-五种单例模型

一. 什么是单例模式 只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在. 单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间: 能够避免由于操作多个实例导致的逻辑错误.如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用,那么单例模式也许是一个值得考虑的选择. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必

java单例设计模式八种方式

单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象.SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式. 单例设计模式八种方式 单例模式有八种方式: 饿汉式( ( 静态常 量) ) 饿汉式(静态

深入理解单例模式:静态内部类单例原理

本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理.OK,废话不多说,进入正文. 首先我们要先了解下单例的四大原则: 1.构造私有. 2.以静态方法或者枚举返回实例. 3.确保实例只有一个,尤其是多线程环境. 4.确保反序列换时不会重新构建对象. 我们常用的单例模式有: 饿汉模式.懒汉模式.双重锁懒汉模式.静态内部类模式.枚举模式,我们来逐一分析下这些模式的区别. 1.饿汉模式: public class SingleTon{ private static Singl

单例模式序列化后反序列化单例失效的问题

不做处理的情况下,单例模式失效,代码如下: public class User implements Serializable { public String getName() { return name; } public void setName(String name) { this.name = name; } public static final User INSTANCE= new User(); private String name ; // private Object r

Java设计模式之单例模式之登记式单例

package 创建型_单例模式_登记式; import java.util.HashMap; import java.util.Map; /** * 登记式单例实际上维护的是一组单例类的实例,将这些实例存储到一个Map(登记簿) * 中,对于已经登记过的单例,则从工厂直接返回,对于没有登记的,则先登记,而后 * 返回 * @author pp * */ public class RegSingleton { /** * 登记簿,用来存放所有登记的实例 */ private static Map

登记式单例实现单例模式的继承(限定一个抽象类的所有子类都必须是单例)

一直都在想如何在Java写一个抽象类,让该抽象类的所有子类都限定为单例模式,一个类需要设计成单例时直接继承该抽象类,而单例的限定与实例获取交给抽象类来完成.一个传统的单例类形如一下形式: 1 public class Singleton { 2 private static final Singleton singleton = new Singleton(); 3 4 //限制产生多个对象 5 private Singleton(){ 6 } 7 8 //通过该方法获得实例对象 9 publi