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的FTP学习(一)[转自奥索]
Oct 09 PHP
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php中jQuery插件autocomplate的简单使用笔记
Jun 14 PHP
php中的strpos使用示例
Feb 27 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php实现Session存储到Redis
Nov 11 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 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
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
详解Python的三种可变参数
2019/05/08 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
Python with语句和过程抽取思想
2019/12/23 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
美德好少年事迹材料
2014/01/19 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
个人股份合作协议书
2014/10/24 职场文书
计划生育工作汇报
2014/10/28 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis
mysql事务对效率的影响分析总结
2021/10/24 MySQL
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技