参考文章:http://duchengjiu.iteye.com/blog/2227452

多态代码

// 多态, 在JAVA中是这样用的, 其实在PHP当中可以自然消除, 因为参数是动态的, 你传什么过来都可以, 不限制类型, 直接调用类的方法

// 多态, 在JAVA中是这样用的, 其实在PHP当中可以自然消除, 因为参数是动态的, 你传什么过来都可以, 不限制类型, 直接调用类的方法
abstract class Tiger {
public abstract function climb();
} class XTiger extends Tiger {
public function climb() {
echo '摔下来';
}
} class MTiger extends Tiger {
public function climb() {
echo '爬到树顶';
}
} class Client {
public static function call(Tiger $animal) {
$animal->climb();
}
} Client::call(new XTiger());
Client::call(new MTiger());

  

面向接口开发代码

// 面向对象里面有一个面向接口开发, 就是一个共同的规格, 你生产插座, 我生产插头

// 共同接口
interface db {
function conn();
} // 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
public function conn() {
echo '连上了MySQL';
}
} class dbsqlite implements db{
public function conn() {
echo '连上了sqlite';
}
} // 客户端, 看不到dbmysql, dbsqlite的内部细节的, 只知道上两个类实现了db接口. $db = new dbmysql();
$db->conn(); // 因为知道这个类实现了db接口, 所以知道有这个conn类 $sqlite = new dbsqlite();
$sqlite->conn(); // 我连我有哪些类我都不希望告诉客户端, 那么怎么进一步进行封装
// 发生连接的双方知道的越少越好, 你还知道我有两个类

  简单工厂模式代码

// 简单工厂

// 面向对象里面有一个面向接口开发, 就是一个共同的规格, 你生产插座, 我生产插头

// 共同接口
interface db {
function conn();
} // 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
public function conn() {
echo '连上了MySQL';
}
} class dbsqlite implements db{
public function conn() {
echo '连上了sqlite';
}
} // 简单工厂
class Factory {
public static function createDB($type) {
if($type == 'mysql') {
return new dbmysql();
} elseif ($type=='sqlite') {
return new dbsqlite();
} else {
throw new Exception("Error db type", 1);
}
}
} // 客户端现在不知道对方到底有哪些类名了
// 只知道对方开放了一个Factory::createDB方法
// 方法允许传递数据库名称 $mysql = Factory::createDB('mysql');
$mysql->conn(); $sqlite = Factory::createDB('sqlite');
$sqlite->conn(); // 原本你知道服务器端的两个类名, 觉得你知道的太多, 再封装起来, 只给一个通道, 更好的适应变化
// 如果以后新增oracle类型, 怎么办?
// 我们PHP随手改了就行, 像JAVA打包一次很麻烦, 又要修改服务端内容
// 服务端要修改Factory的内容(在java, c++中, 改后还得再编译)
// 这个时候就想如何来改进呢
// 在OOD(面向对象设计)的法则中, 有重要的开闭原则--对于修改是封闭的, 对于扩展是开放的.
// 你可以新增一个源代码, 不要修改旧的代码 //现在用第二种办法, 叫工厂方法

  工厂方法代码

// 共同接口
interface db {
function conn();
} interface Factory {
function createDB();
} // 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
public function conn() {
echo '连上了MySQL';
}
} class dbsqlite implements db{
public function conn() {
echo '连上了sqlite';
}
} class mysqliFactory implements Factory{
public function createDB() {
return new dbmysql();
}
} class sqliteFactory implements Factory {
public function createDB() {
return new dbsqlite();
}
} // 服务器端添加oracle类
// 前面的代码不用改
// 我就新增一个数据库驱动类和一个工厂, 这样就避免了对源代码的修改
class dboracle implements db {
public function conn() {
echo '连接上了oracle';
}
} class oracleFactory implements Factory {
public function createDB() {
return new dboracle();
}
} // 客户端开始, 对方给了两个api, 一个db的api, 一个是创造数据库的api
$fact = new mysqliFactory();
$db = $fact->createDB();
$db->conn(); $fact = new sqliteFactory();
$db = $fact->createDB();
$db->conn();

  单例设计模式代码

// 单例
// 一般来说一个中小型网站一个db去连接数据库就行了
// 想想, 能不能只有一个db类, 一个upload类, 一个cookie类
// 类肯定只有一个, 如何保证类的实例也只有一个 // 2个对象是同一个的时候才全等 // 单例模式 class single {
protected static $ins = null; // 控制权限, 封锁new操作, 把大门关上了, 需要留一个小窗户
// 方法前加final, 则方法不能被覆盖, 类前加final, 则类不能被继承
final protected function __construct() {}
// 防clone
final protected function __clone(){} //留一个接口来new对象
public static function getIns() {
if(self::$ins == null) {
self::$ins = new self();
}
return self::$ins;
}
} $s1 = single::getIns();
$s2 = single::getIns(); if ($s1 === $s2) {
echo '是一个对象';
} else {
echo '不是一个对象';
}

  

php 设计模式系列(一)的更多相关文章

  1. .NET设计模式系列文章 from TerryLee

    http://www.cnblogs.com/Terrylee/archive/2006/07/17/334911.html 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来 ...

  2. Android设计模式系列

    http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...

  3. .NET设计模式系列文章

    原文地址:http://terrylee.cnblogs.com/archive/2006/06/01/334911.html 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记 ...

  4. javascript设计模式系列

    javascript设计模式系列   创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式( ...

  5. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

  6. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  7. C#设计模式(0)-设计模式系列文章导航

    设计模式系列文章导航  C#设计模式(1)——单例模式(SingletonPattern) C#设计模式(2)——简单工厂模式(SimpleFactory)    C#设计模式(3)——工厂方法模式( ...

  8. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  9. 关于 MVVMLight 设计模式系列

    MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...

  10. Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

随机推荐

  1. 使用HAXM加速Android虚拟机

    Android虚拟机在支持Intel VT技术的CPU上,可以使用HAXM(Hardware Accelerated Execution Manager)得到硬件加速支持,使得虚拟机运行速度得到极大提 ...

  2. max_%_connection参数详解

    对于连接数的设置,show variables里有三个参数可以对它进行控制,max_connections与max_user_connections以及max_connect_errors.下面对这三 ...

  3. ListView控件的Insert、Edit和Delete功能第三部分(自我总结)

    1.刚开始在第一部分显示数据的时候出现如下错误: 修改: @Page 中的EnableEventValidation="false" 2.点击各个按钮没有反应. 修改:为page_ ...

  4. FileSystemXmlApplicationContext方法的绝对路径问题

    public AgentServer(Socket c,String confDir) { this.client = c; ApplicationContext ac = new FileSyste ...

  5. Swift 响应式编程 浅析

    这里我讲一下响应式编程(Reactive Programming)是如何将异步编程推到一个全新高度的. 异步编程真的很难 大多数有关响应式编程的演讲和文章都是在展示Reactive框架如何好如何惊人, ...

  6. Mac系统Git生成ssh公钥

    Mac系统Git生成ssh公钥 在使用Git仓库进行代码管理时,新的电脑上往往需要生成ssh公钥进行匹配,Mac系统生成Git公钥过程如下: 1.检查本机是否已有公钥 在终端中输入如下命令: ? 1 ...

  7. 新建aix实例

    http://www.cnblogs.com/kfarvid/archive/2010/12/21/1912553.html   DB2数据库 http://wenku.baidu.com/view/ ...

  8. VideoView的视频的全屏播放

    import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.I ...

  9. IDA_Python命令行使用

    Python>import idaapi Python>hex(idaapi.get_first_cref_from(here()))

  10. html5 之本地数据存储

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 cookie与webSt ...