PHP单例模式的三私一公

单例模式:即一个类只被实例化一次,当其他人对其再次实例化时,便返回第一次实例化的对象。这种模式可以极大地节约资源。典型应用于数据库类的实例化。
以实例化一个Mysql数据库类为例:
要实现一个类只实例化一次,就必须堵住其他实例化的入口。
1.实例化类时,会自动调用类的构造方法,因为将构造方法设置为private属性,限制为只能在类内部实例化

 private function __construct(){
 }

2.定义一个静态方法,在类内部实例化对象。实例化前先判断该类是否已被实例化了,若已被实例化,就返回该实例化对象;若没被实例化,便实例化一个对象并将该对象保存在类的静态属性中

 private static $self = null;
 public static function create(){
  if (self::$self === null) {
   self::$self = new self();
  }
  return self::$self;
 }

3.禁止克隆,对象之间进行克隆可生成不同的对象。而克隆时会自动调用类的__conle方法,因此将克隆方法设置为private属性

 private function __clone(){
 }

综上,三私一公(三个私有属性和一个公共方法)单例模式的代码如下:

class Mysql {
 private static $self = null;
 public static function create(){
  if (self::$self === null) {
   self::$self = new self();
  }
  return self::$self;
 }
 private function __construct(){
 }
 private function __clone(){
 }
}

$a = Mysql::create();
$b = Mysql::create();
/*判断两个类是否为同一个类*/
echo $a===$b ? 1 : 0;
时间: 2024-10-17 17:50:40

PHP单例模式的三私一公的相关文章

php单例模式之“三私一公”

单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式.具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式的特点 单例模式的主要特点是“三私一公”:需要一个保存类的唯一实例的私有静态成员变量构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义克隆函数必须声明为私有的,防止对象被克隆必须提供一个访问这个实例的公共静态方法(通常命名为g

设计模式之单例模式(三种实现方式)

一.单例模式要点 1.单例,顾名思义,某个类仅仅能有一个实例. 2.它必须自行创建这个唯一的实例. 3.它必须自行向整个系统提供这个实例. 二.单例模式的三种实现 1.饿汉式单例类(类载入时就初始化) 代码实现 public class EagerSingleton { //私有的类成员常量 private static final EagerSingleton SINGLETON=new EagerSingleton(); //私有的默认构造方法.此类不能被继承 private EagerSi

张小二求职记之 单例模式(三)之决战多线程

M:上回说的多线程的单例模式会了? z;略懂 M:写一个吧 package 单例模式; public class Singleton { private static Singleton instance=null; private Singleton() { System.out.println("单例构造函数"); } public static Singleton getInstance() { if(instance==null) { instance=new Singleto

单例模式的三种实现方式

一.单例模式的三种实现方式 1. 什么是单例模式 基于某种方法,实例化多次,得到同一个实例/对象 2. 为什么用单例模式 实例化多次,得到的对象属性内容都一样时,应该将这些对象指向同一个内存,即同一个实例,来节省内存空间 1. 实现单例模式方式一:类内部定义类方法实现 实现方法:类中定义了一个类方法 # 未单例模式前 import setting class Mysql: def __init__(self,ip,port): self.ip=ip self.port=port @classme

RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ============================================== // 私钥加密 std::string rsa_pri_encrypt(const std::string &clearText, std::string &pubKey) { std::string strRet; BIO *keybio

python实现单例模式的三种方式及相关知识解释

python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念. 1. module实现 #模块实现 from

单例模式的三种实现 以及各自的优缺点

单例模式:单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有三种:懒汉式单例,饿汉式单例,登记式单例. 1.懒汉式单例 public class Singleton { private static Singleton singleton; private Singleton() {} //此类不能被实例化 public static synchronized Singleton getInstance() {

设计模式:单例模式的三种创建方式及其各自的优缺点

单例模式: 确保一个类仅仅有一个实例,并提供全局訪问点.在Java中实现单例模式须要私有的构造器,一个静态方法和一个静态变量.确定在性能和资源上 的限制,怎样选择适当的方案来实现单例,以解决多线程的问题. 假设使用多个类载入器,可能导致单例失效产生多个实例.双重检查加锁不适用于1.4及更早版本号的java. 方式1: package singleton; /** * 同步getInstance()方法: * 有点:保证线程安全. * 缺点:性能大大下降 * @author Arvon * */

java单例模式的三种实现(线程安全)

直接上代码(代码注释比较完整): 第一种: package pattern.singleton.doublecheck; public class Singleton {  // 私有化默认构造方法,防止外部生成此实例 private Singleton(){}  // 声明此单一实例 // volatile: 能够及时通知其他线程,更新其线程缓存数据 private volatile static Singleton INSTANCE;  // 向外提供此单一实例 public static