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 日期时间函数的高级应用技巧
Oct 10 PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
Jan 07 PHP
域名和cookie问题(域名后缀)
Oct 10 PHP
浅析echo(),print(),print_r(),return之间的区别
Nov 27 PHP
Destoon模板制作简明教程
Jun 20 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php生成唯一的订单函数分享
Feb 02 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 21 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
5款非常棒的Python工具
2018/01/05 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
python学习开发mock接口
2019/04/28 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python实现扫雷游戏
2020/03/03 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
人事助理岗位职责
2013/11/18 职场文书
签约仪式主持词
2014/03/19 职场文书
实习推荐信
2014/05/10 职场文书
运动员获奖感言
2014/08/15 职场文书
男方婚前保证书
2015/02/28 职场文书
保研推荐信格式
2015/03/25 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
golang连接MySQl使用sqlx库
2022/04/14 Golang