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 相关文章推荐
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
Jul 04 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP实现的购物车类实例
Jun 17 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
php输出文字乱码的解决方法
Oct 04 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
javascript帧动画(实例讲解)
2017/09/02 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
python hough变换检测直线的实现方法
2019/07/12 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
西班牙在线光学:Visual-Click
2020/06/22 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
干部培训自我鉴定
2014/01/22 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
初中生操行评语大全
2014/04/24 职场文书
工作求职自荐信
2014/06/13 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
三峡导游词
2015/01/31 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js