php 设计模式系列(一)
参考文章: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 设计模式系列(一)的更多相关文章
- .NET设计模式系列文章 from TerryLee
http://www.cnblogs.com/Terrylee/archive/2006/07/17/334911.html 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来 ...
- Android设计模式系列
http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...
- .NET设计模式系列文章
原文地址:http://terrylee.cnblogs.com/archive/2006/06/01/334911.html 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记 ...
- javascript设计模式系列
javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式( ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- [js高手之路] 设计模式系列课程 - jQuery的extend插件机制
这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...
- C#设计模式(0)-设计模式系列文章导航
设计模式系列文章导航 C#设计模式(1)——单例模式(SingletonPattern) C#设计模式(2)——简单工厂模式(SimpleFactory) C#设计模式(3)——工厂方法模式( ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
- 关于 MVVMLight 设计模式系列
MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...
- Java 设计模式系列(二三)访问者模式(Vistor)
Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...
随机推荐
- 全文检索工具推荐FileLocator
全文检索工具推荐FileLocator https://www.baidu.com/link?url=_vaDZaJ_OePrAX-BTUD5hjTymnvN7_1oIAnWyS25hqxAg0nUH ...
- python2.x 使用protobuf
1.在windows下配置protobuf 1.1 下载对应的包,包含两个:protoc.exe和源码文件(protoc也可以自己生成) 下载地址1 --- google code最近在迁移,也许以后 ...
- apicloud教程1 (转载)
非常感谢APICloud官方给我版主职位,每天都看到很多朋友提出很多问题,我就借此机会写了一系列的教程,帮助大家从小白到高手之路.系列名称:<APICloud之小白图解教程系列>,会不定时 ...
- java获取数据库的列名、类型等信息
当你使用和学习JDK的时候,可以查看并学习它所提供给你的两个ResultSetMetaData 和DataBaseMetaData类的源码并很好的了解它们的实现原理和思路,JDBC中提供有两种源数据, ...
- Exams
Exams time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...
- Socks
Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...
- SEO策略与细节:细节决定成败
昨天展开seo探讨会.听了一场医疗界seo大神的讲座.收益匪浅今天讲他的演讲内容整理出来与大家分享.希望对医疗界的seo带来些帮助.站长们一起成长! 一.首页 1.元标签设置 标题:上海癫痫病医院哪家 ...
- js获取当前日期与星期
var currentDate = new Date(); var weekday = ["星期日", "星期一", "星期二", &quo ...
- Webdriver+testNG+ReportNG+Maven+SVN+Jenkins自动化测试框架的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- iOS进阶推荐的书目
<Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法>([英]Matt Galloway) 很多面试题有涉及 <IOS数据库应用高级编 ...