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

yipeiwu_com6年前PHP代码库

一. 单例模式(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...)单从某一个实体工厂看,其实就是一个工厂方法模式

如果上面的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下获取上个月、下个月、本月的日期(strtotime,date)

今天写程序的时候,突然发现了很早以前写的获取月份天数的函数,经典的switch版,但是获得上月天数的时候,我只是把月份-1了,估计当时太困了吧,再看到有种毛骨悚然的感觉,本来是想再处理一...

加强版phplib的DB类

复制代码 代码如下:<?php /*************************************************************************...

php中的钩子理解及应用实例分析

本文实例讲述了php中的钩子理解及应用。分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现...

PHP实现的解汉诺塔问题算法示例

PHP实现的解汉诺塔问题算法示例

本文实例讲述了PHP实现的解汉诺塔问题算法。分享给大家供大家参考,具体如下: 问题描述: 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(...

php面向对象之反射功能与用法分析

本文实例讲述了php面向对象之反射功能与用法。分享给大家供大家参考,具体如下: 个人对反射定义的理解: 首先得说说什么叫反射。对于一个新手来说,反射这个概念常常给人一种似懂非懂的 感觉,...