PHP面向对象学习笔记之二 生成对象的设计模式


Posted in PHP onOctober 06, 2012

一. 单例模式(Singleton)
如果应用程序每次包含且仅包含一个对象,那么这个对象就是一单例. 用来替代全局变量.

<?php 
require_once("DB.php"); 
class DatabaseConnection{ 
<STRONG><SPAN style="COLOR: #ff0000">public static function get()</SPAN></STRONG>{ 
static $db = null; 
if ( $db == null ) 
$db = new DatabaseConnection(); 
return $db; 
} 
private $_handle = null; 
<STRONG><SPAN style="COLOR: #ff0000">private function __construct()</SPAN></STRONG> { 
$dsn = 'mysql://root:password@localhost/photos'; 
$this->_handle =& DB::Connect( $dsn, array() ); 
} 
public function handle() 
{ 
return $this->_handle; 
} 
} 
print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); 
print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); 
?>

二.工厂方法模式(factory method)要解决的问题:

1>在代码运行时候才知道要生成的对象类型; 2>对象类型可能要扩充新产品类型; 3>每个产品类型都可以定制特定的功能;工厂方法模式把创建者类与要生产的产品类分离.创建者是一个工厂类,其中定义了用于生成产品对象的类方法.如果没有提供默认实现,就由创建者类的子类来执行实例化.一般情况下,就是每个创建者类的子类实例化一个相应的产品子类.工厂模式的优点就在创建对象上。 它的任务就是把对象的创建过程都封装起来,然后返回一个所需要的新类。想改变对象的结构和建立对象的方式,只需选择对象工厂,对代码的改变只需要一次就够了。( 工厂模式的功能是如此强大, 它处于是应用的底层, 所以在许多其余的复杂模式和应用中它会不停地出现。)不同处理对象,内部自动分流处理,但对用户来说,只有一个方法,简单方便 使用接口方式实践工厂模式的例子:

interface Hello{ 
function say_hello(); 
} 
class English implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
class Chinese implements Hello{ 
public function say_hello(){ 
echo "你好"; 
} 
} 
class speak{ 
public static function factory($type){ 
if($type == 1) $temp = new English(); 
else if($type == 2) $temp = new Chinese(); 
else{ 
die("Not supported!"); 
} 
return $temp; 
} 
} 
$test = Speak::factory(1); 
$test->say_hello();

在<深入浅出设计模式>中,上面的被称为简单工厂模式,因为这个工厂必须能分辨要生产的全部产品.如果有新的产品,必须对工厂进行对应修改,增加相应的业务逻辑或判断.简单工厂模式的一个标志就是静态方法实现工厂生产功能.(不简单的)工厂方法模式: 工厂方法是抽象类或接口,具体工厂实现这个方法(接口),让使用者调用以创建具体产品对象(每一个产品都有对应的具体工厂)下面是重写的hello
//抽象工厂 
interface Speaker{ 
function assignSpeaker(); 
} 
//具体工厂1 
class EnglishSpeaker implements Speaker{ 
public function assignSpeaker(){ 
return new English(); 
} 
} 
//具体工厂2 
class ChineseSpeaker implements Speaker{ 
public function assignSpeaker(){ 
return new Chinese(); 
} 
} 
//抽象产品 
interface Hello{ 
function say_hello(); 
} 
//具体产品1 
class English implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
//具体产品2 
class Chinese implements Hello{ 
public function say_hello(){ 
echo "你好"; 
} 
}

使用:
if(!empty($_GET['t'])){ 
switch($_GET['t']){ 
case 1: $temp=new EnglishSpeaker(); 
break; 
case 2: $temp=new ChineseSpeaker(); 
break; 
} 
$man=$temp->assignSpeaker(); 
$man->say_hello(); 
}

三.抽象工厂模式(Abstract Factory)产品族;每个实体工厂负责一个产品族(1,2...)的产品, 而每个产品族又划分出几个不同类别(A,B...)单从某一个实体工厂看,其实就是一个工厂方法模式
PHP面向对象学习笔记之二 生成对象的设计模式
如果上面的hello例子,又多出来表达方式,正常和歌唱式表达(2个产品族)
//抽象工厂 
abstract class Speaker{ 
const NORMAL =1; 
const SING =2; 
abstract function assignSpeaker($flag_int); 
} 
//具体工厂1 
class EnglishSpeaker extends Speaker { 
public function assignSpeaker($flag_int){ 
switch($flag_int){ 
case self::NORMAL: 
return new NormalEnglish(); 
break; 
case self::SING: 
return new SingEnglish(); 
break; 
} 
} 
} 
//具体工厂2 
class ChineseSpeaker extends Speaker{ 
public function assignSpeaker($flag_int){ 
switch($flag_int){ 
case self::NORMAL: 
return new NormalChinese(); 
break; 
case self::SING: 
return new SingChinese(); 
break; 
} 
} 
} 
//抽象产品 
interface Hello{ 
function say_hello(); 
} 
//具体产品A1 
class NormalEnglish implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
//具体产品B1 
class NormalChinese implements Hello{ 
public function say_hello(){ 
echo "你好!"; 
} 
} 
//具体产品A2 
class SingEnglish implements Hello{ 
public function say_hello(){ 
echo "Oh, jingle bells, jingle bells, Hello! Hello! Hello!"; 
} 
} 
//具体产品B2 
class SingChinese implements Hello{ 
public function say_hello(){ 
echo "叮叮当,叮叮当, 你好!你好!你好!"; 
} 
}

使用:
//根据程序的业务逻辑确定具体工厂 
switch($_GET['language']){ 
case 1: $temp=new EnglishSpeaker(); 
break; 
case 2: $temp=new ChineseSpeaker(); 
break; 
} 
//根据程序的业务逻辑确定具体产品,无需关心是哪个具体工厂了,维护性提高 
$man=$temp->assignSpeaker( $_GET['style']); 
//使用产品,无需关心是哪个具体产品 
$man->say_hello();

四.原型模式(Prototype)
使用clone 来复制已存在的具体产品,然后具体产品类本身就成为他们自己生成的基础.
PHP 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php的大小写敏感问题整理
Dec 29 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP加密解密字符串汇总
Apr 26 PHP
分享PHP守护进程类
Dec 30 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
php实现的生成排列算法示例
Jul 25 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 #PHP
php生成局部唯一识别码LUID的代码
Oct 06 #PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 #PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 #PHP
PHP中的生成XML文件的4种方法分享
Oct 06 #PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 #PHP
PHP正则表达式之定界符和原子介绍
Oct 05 #PHP
You might like
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
老师的检讨书
2014/02/23 职场文书
党支部四风整改方案
2014/10/25 职场文书
员工评语范文
2014/12/31 职场文书
2016年元旦致辞
2015/08/01 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers
Python作用域和名称空间的详细介绍
2022/04/13 Python