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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
用PHP连mysql和oracle数据库性能比较
Oct 09 PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
php中array_multisort对多维数组排序的方法
Jun 21 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
php字符串的替换,分割和连接方法
May 23 PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 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
星际实力自我测试
2020/03/04 星际争霸
php实现的在线人员函数库
2008/04/09 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
深入解析contentWindow, contentDocument
2013/07/04 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Python while true实现爬虫定时任务
2020/06/08 Python
了解一下python内建模块collections
2020/09/07 Python
仓库理货员岗位职责
2013/12/18 职场文书
物流专业自荐信
2014/05/23 职场文书
监督检查工作方案
2014/05/28 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
顶岗实习计划书
2015/01/16 职场文书
营销计划书范文
2015/01/17 职场文书
员工辞职信怎么写
2015/02/27 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
歼十出击观后感
2015/06/11 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
关于Python使用turtle库画任意图的问题
2022/04/01 Python
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL