一. 单例模式(singleton)
如果应用程序每次包含且仅包含一个对象,那么这个对象就是一单例. 用来替代全局变量.
复制代码 代码如下:
require_once("db.php");
class databaseconnection{
public static function get(){
static $db = null;
if ( $db == null )
$db = new databaseconnection();
return $db;
}
private $_handle = null;
private function __construct() {
$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 来复制已存在的具体产品,然后具体产品类本身就成为他们自己生成的基础.
0
0
相关文章
PHP怎么写OAuth2客户端密钥_PHP写OAuth2密钥配置示例【详解】
PHP如何创建文件并加密_简单文件加密解密方法【详解】
PHP Carbon 时间差计算失效的常见原因与正确用法
怎样读取CSV文件到数组_PHP读取CSV文件转换为数组方法【操作】
如何正确使用 PHP Carbon 计算两个时间点之间的精确差值
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。
616
2026.02.13
本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。
194
2026.02.13
本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。
91
2026.02.13
本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。
20
2026.02.13
本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。
54
2026.02.13
本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。
15
2026.02.12
本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。
598
2026.02.12
本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。
56
2026.02.12
热门下载
相关下载
精品课程
最新文章


