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 相关文章推荐
PHP中在数据库中保存Checkbox数据(1)
Oct 09 PHP
让PHP以ROOT权限执行系统命令的方法
Feb 10 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 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
长波有什么东西
2021/03/01 无线电
php mail to 配置详解
2014/01/16 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
javascript开发中因空格引发的错误
2010/11/08 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
原生javaScript实现图片延时加载的方法
2014/12/22 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
python类中super()和__init__()的区别
2016/10/18 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
Python中如何导入类示例详解
2019/04/17 Python
pandas取出重复数据的方法
2019/07/04 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
远东集团网络工程师面试题
2014/10/20 面试题
质量保证书范本
2014/04/29 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
检讨书怎么写
2015/01/23 职场文书
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript