PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式


Posted in PHP onJune 12, 2014

毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

单例模式

当需要保证某个对象只能有一个实例的时候,单例模式非常有用。它把创建对象的控制权委托到一个单一的点上,任何时候应用程序都只会仅有一个实例存在。单例类不应该可以在类的外部进行实例化一个单例类应该具备以下几个要素。

必须拥有一个访问级别为 private 的构造函数,有效防止类被随意实例化。

必须拥有一个保存类的实例的静态变量。

必须拥有一个访问这个实例的公共的静态方法,该方法通常被命名为 GetInstance()。

必须拥有一个私有的空的__clone方法,防止实例被克隆复制。

下面用一个简单的单例类的例子来说明

class ClassName
{
    public static $_instance;
    private function __construct()
    {
        # code...
    }
    private function __clone()
    {
        # empty
    }
    public static function GetInstance()
    {
        if(!(self::$_instance instanceof self))
        {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    public function SayHi()
    {
        echo "Hi boy!";
    }
}
$App= ClassName::GetInstance();
$App->SayHi();
/**
 *
 * Output
 *
 * Hi boy! 
 *
 */

简单工厂模式

当你有大量的实现同一接口的类的时候,在合适的时候实例化合适的类,如果把这些 new 分散到项目的各个角落,不仅会使业务逻辑变的混乱并且使得项目难以维护。这时候如果引进工厂模式的概念,就能很好的处理这个问题。我们还可以通过应用程序配置或者提供参数的形式让工厂类为我们返回合适的的实例。

工厂类,它把实例化类的过程放到各工厂类里头,专门用来创建其他类的对象。工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类可以很方便的使用了。下面简单举例说明下工厂类的使用。

interface ProductInterface
{
    public function showProductInfo();
}
class ProductA implements ProductInterface
{
    function showProductInfo()
    {
        echo 'This is product A.';
    }
}
class ProductB implements ProductInterface
{
    function showProductInfo()
    {
        echo 'This is product B.';
    }
}
class ProductFactory
{
    public static function factory($ProductType)
    {        
        $ProductType = 'Product' . strtoupper($ProductType);
        if(class_exists($ProductType))
        {
            return new $ProductType();
        }
        else
        {
            throw new Exception("Error Processing Request", 1);
        }
    }
}
//这里需要一个产品型号为 A 的对象
$x = ProductFactory::factory('A');
$x -> showProductInfo();
//这里需要一个产品型号为 B 的对象
$o = ProductFactory::factory('B');
$o -> showProductInfo();
//都可以调用showProductInfo方法,因为都实现了接口 ProductInterface.

小结

模式就像是软件工程的基石脉络像大厦的设计图纸一样,这里接触了两种模式:单例模式和工程模式。单例类中存在一个静态变量保存着自身的一个实例,并且提供了获取这个静态变量的静态方法。单例类还应该把构造函数和clone函数标记为私有的,防止破换实例的唯一性。工厂模式根据传入的参数或程序的配置来创建不同的类型实例,工厂类返回的是对象,工厂类在多态性编程实践中是至关重要的。

PHP 相关文章推荐
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
fgetcvs在linux的问题
Jan 15 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
Apr 08 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
CodeIgniter生成静态页的方法
May 17 PHP
微信支付的开发流程详解
Sep 13 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
php array_keys 返回数组的键名
Oct 25 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 #PHP
对PHP语言认识上需要避免的10大误区
Jun 12 #PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 #PHP
PHP微框架Dispatch简介
Jun 12 #PHP
PHP资源管理框架Assetic简介
Jun 12 #PHP
You might like
Terran历史背景
2020/03/14 星际争霸
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
destoon数据库表说明汇总
2014/07/15 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
制作特殊字的脚本
2006/06/26 Javascript
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
Web开发之JavaScript
2012/03/29 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
python编程线性回归代码示例
2017/12/07 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
表彰大会主持词
2014/03/26 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
欠条范文
2015/07/03 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
Golang 实现WebSockets
2022/04/24 Golang