PHP China | 中国开源之路 's Archiver

PHPChina 发表于 2006-3-4 18:03

->Singleton Pattern 单件模式

->单件模式(Singleton Pattern)是最知名的几个设计模式之一。这个设计模式要解决的问题是通过一个统一的对象来解决应用中的集中操作,比如一个日志对象。在这种情况下,我们需要在整个业务中仅有这么一个对象实例存在,并且所有的应用脚本都可以访问它。比如刚才提到的日志对象,我们需要整个应用都能访问这个对象并写入日志文件,并且让这个统一的日志写入机制处理和过滤日志信息,而这个机制的标准是统一的。因此,为了达到我们想到的效果,我们使用单件模式。
   如何定义一个单件模式的类呢。常用的方法就是使用一个静态的方式函数(getInstance),并且通过它来返回唯一的单件对象实例。当你第一次访问它的时候,这个方式函数创建一个实例,并且保存为一个私有的静态变量,并把对象实例返回给你。在接下来的使用中,它无需再次生成实例,而是直接吧保存的实例处理变量返回给你。
   请看这个例子:
   代码:singleton_pattern.php

PHPChina 发表于 2006-3-4 18:04

[php]
<?php
class Logger{
        static function getInstance()
        {
                if (self::$instance == null) {
                        self::$instance = new Logger();
                }
                return self::$instance;
        }
       
        private function __construct()
        {
               
        }
        private function __clone()
        {
               
        }
        function Log($str)
        {
                //Take care of logging
        }
        static private $instance = Null;
}

Logger::getInstance()->Log("Checkpoint");


?>
[/php]

PHPChina 发表于 2006-3-4 18:04

在这个设计模式中,最基本的东西是Logger:getInstance(),它帮助你在应用的任何一个时间内访问这个日志对象。无论,你是在函数,对象还是全局变量环境中使用。
   这个例子里面,大家可以看到constructor和clone两个构造函数都被定义为私有的,也就是说开发工程师不会错误地通过new或者clone来生成一个新的日志实例。因此,getInstance()是唯一能都访问这个单件对象的方式。

szy_session1987 发表于 2006-3-4 21:18

只能学习,一点也不懂......

seraph 发表于 2006-3-4 22:52

[quote]原帖由 [i]szy_session1987[/i] 于 2006-3-4 21:18 发表
只能学习,一点也不懂...... [/quote]

我也很少用,但要先看明白,然后在实践中,你会突然明白:原来就是这么一回事呀,哈哈。

PHPChina 发表于 2006-3-4 22:59

重要的对象!或者是通过一个设置统一控制的对象,都可以用单件模式来限制。这样的安全性和数据结构稳定性方面可以得到有效的保障。

liaoruo 发表于 2006-3-5 01:14

不知道为什么参与的人越来越少了

upant 发表于 2006-3-5 08:20

[quote]原帖由 [i]liaoruo[/i] 于 2006-3-5 01:14 发表
不知道为什么参与的人越来越少了 [/quote]

大晚上1点,哪来的人?

PHP面向对象编程小菜菜我有好多疑问。
大体上看了一下4个例子,可以说基本上大概可能是看不大明白。:lol

从上次看了PHPLIB的db_mysql类之后我就好迷茫,
还请个位大虾指点,PHP的mysql函数不是已经挺强大了吗?
为什么非要写个db类,再通过这些db类来调用这些函数。
难道这么速度不会降低吗?至少代码是多了不好。
还有很多类都是这样,总是把简单的东西也写的那么复杂。
难道这样写的让人转好几个弯才能明白才能体现出一个人的“才华”?
我只是说我看到的一部分让我迷茫的地方。可能我实在是太菜了,
对高手们有太多的误解。还请个位大虾把我领回正路。

PHPChina 发表于 2006-3-5 09:37

楼上PHP选手:
    你说的问题确实存在,如果就从单一的脚本自身而言,采用面向对象的类封装确实会给人造成多余的感觉。这也是为什么,我们这次主题并不是讨论面向对象,而是讨论设计模式。正因为设计模式的兴起,面向对象才迅速地发展起来。

    而设计模式要实现的就是功能模块化,方便于程序员互通、共享和代码重复使用等等,以便加快开发速度。那么要实现设计模式,就必需使用面向对象来封装。

    另外,PHP在数据库才操作层面确实已经是很丰富了,所以会显得一些模板的db类有些不必要。但是你也会发现我们这次的主题在数据库方面的讨论不多,我们讨论的是更有实际意义的应用模块。比如权限分配,数据对应关系等等。

    还有,因为PHP5面向对象的内容网上不多,所以如果大家觉得代码里面有比较费解的地方,我们可以详细讨论。:)

帅的不能再输啦 发表于 2006-3-5 13:37

。。。。

静态,私有,克隆,构造,

weiwei 发表于 2006-3-5 16:51

重要的对象!或者是通过一个设置统一控制的对象,都可以用单件模式来限制。这样的安全性和数据结构稳定性方面可以得到有效的保障。

哈哈,我觉得 这段说得太专业化了吧,

fengguo60 发表于 2006-3-8 19:33

最简单得例子就是应用于数据库连接,取代全局变量。

刀客羽朋 发表于 2006-3-11 17:46

建议下次从面向对象开始吧。
直接上设计模式。汗。。

sage 发表于 2006-3-17 03:33

根本一定都不明白啥意思

rephp 发表于 2006-3-31 09:18

这个好像是php5手册中的吧,能看懂代码,但要在实际中去应用,还是有点问题
在例子中,
static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new Logger();
        }
        return self::$instance;
    }

static private $instance = Null;被定义为静态私有,那么每次使用 getInstance()的时候,他不是应该去判断 if (self::$instance == null)吗?而这个表达式的值似乎永过是真的,那么它不是会去执行 self::$instance = new Logger();吗?

"当你第一次访问它的时候,这个方式函数创建一个实例,并且保存为一个私有的静态变量,并把对象实例返回给你。在接下来的使用中,它无需再次生成实例,而是直接吧保存的实例处理变量返回给你。
"
这句不是很能明白,我不是很懂oop啊

[[i] 本帖最后由 rephp 于 2006-3-31 09:31 编辑 [/i]]

scorpion 发表于 2006-10-14 00:56

看看这样的沉年旧帖

深蓝色 发表于 2007-1-11 20:20

数据库,模板,用单件模式正合适啊,呵呵。

luzhou 发表于 2007-12-15 15:56

tukiz15

luzhou 发表于 2008-2-6 09:03

tukiz01 tukiz01

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.