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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
PHP排序算法的复习和总结
Feb 15 PHP
三种php连接access数据库方法
Nov 11 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP高并发和大流量解决方案整理
Mar 09 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
php登录超时检测功能实例详解
2017/03/21 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python调用支付宝支付接口流程
2019/08/15 Python
pycharm导入源码的具体步骤
2020/08/04 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
高中军训第一天感言
2014/03/06 职场文书
公关活动策划方案
2014/05/25 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
品质保证书格式
2015/02/28 职场文书
同学聚会通知短信
2015/04/20 职场文书
乒乓球比赛通知
2015/04/27 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
浅谈Python 中的复数问题
2021/05/19 Python