PHP单例模式与工厂模式详解


Posted in PHP onAugust 29, 2017

一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:

1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法

单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 

单例模式实例

<?php
class Single {
  private $name;//声明一个私有的实例变量
  private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
  
  }
 
  static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
  static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
   if(!self::$instance) self::$instance = new self();
   return self::$instance;
  }
 
  public function setname($n){ //给变量$name赋值
$this->name = $n; 
 }
  public function getname(){ //取变量$name的值
return $this->name; 
 }
 }
 
 
 $a = Single::getinstance();
 $b = Single::getinstance();
 $a->setname('hello world');
 $b->setname('good morning');
 echo $a->getname();//good morning
 echo $b->getname();//good morning
?>

二、工厂模式就是一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new。

这样如果想更改创建的对象类型,只需更改该工厂即可。

<?php
//工厂类(关于运算符的操作)
class factory{
 public static function dx($ope){
  switch($ope){
   case "+":
    return new plus();
    break;
   case "-":
    return new sub();
    break;
   case "%":
    return new rem();
    break;
  }
 }
} 
$ope = factory::dx("+");
$ope->a = 20;
$ope->b = 10;
echo $ope->opera();

工厂模式实例

class Factory {//创建一个基本的工厂类
  static public function fac($id){//创建一个返回对象实例的静态方法
   if(1 == $id) return new A();
   elseif(2==$id) return new B();
   elseif(3==$id) return new C();
   return new D();
  }
 }
 
 interface FetchName {//创建一个接口
  public function getname();//
 }
 
 class A implements FetchName{
  private $name = "AAAAA";
  public function getname(){ 
return $this->name; 
}
 }
 
 class C implements FetchName{
  private $name = "CCCCC";
  public function getname(){
return $this->name; 
}
 }
 class B implements FetchName{
  private $name = "BBBBB";
  public function getname(){ 
return $this->name;
}
 }
 
 class D implements FetchName{
  private $name = "DDDDD";
  public function getname(){ 
return $this->name; 
}
}
 
 
 $o = Factory::fac(6);//调用工厂类中的方法
 if($o instanceof FetchName){
 echo $o->getname();//DDDDD
 }
 
 $p=Factory::fac(3);
 echo $p->getname();//CCCCC
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
PHP 登录记住密码实现思路
May 07 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
基于PHP的简单采集数据入库程序【续篇】
Jul 30 PHP
php通过session防url攻击方法
Dec 10 PHP
php静态文件生成类实例分析
Jan 03 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
PDO::getAttribute讲解
Jan 28 PHP
PHP数组与字符串互相转换实例
May 05 PHP
PHP迭代与递归实现无限级分类
Aug 28 #PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
php检查函数必传参数是否存在的实例详解
Aug 28 #PHP
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
javascript中Function类型详解
2015/04/28 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
盘点提高 Python 代码效率的方法
2014/07/03 Python
python有证书的加密解密实现方法
2014/11/19 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
Weblogc domain问题
2014/01/27 面试题
好的自荐信包括什么内容
2013/11/07 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
家电创业计划书
2019/08/05 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Java中API的使用方法详情
2022/04/06 Java/Android