PHP结构型模式之享元模式详解
作者:PHP隔壁老王邻居 发布时间:2023-05-27 22:38:40
标签:PHP,享元模式,结构型模式
享元模式(Flyweight Pattern)是什么
享元模式是一种结构型模式,它通过共享对象来减少系统中的对象数量,从而降低了内存的使用和系统的复杂度。这种类型的设计模式属于结构型模式,它提供了一个将对象共享的方法,从而减少内存和对象的使用。
享元模式的优点
享元模式可以减少系统中的对象数量,从而降低了内存的使用;
享元模式可以提高系统的性能和效率,因为它避免了重复创建相似的对象;
享元模式可以使系统更加灵活,因为它可以动态地添加或删除共享对象。
享元模式的实现
在 PHP 中,我们可以使用以下方式来实现享元模式:
<?php
// 享元接口
interface Flyweight
{
public function operation();
}
// 具体享元类
class ConcreteFlyweight implements Flyweight
{
private $state;
public function __construct($state)
{
$this->state = $state;
}
public function operation()
{
echo "ConcreteFlyweight with state {$this->state} is operated.\n";
}
}
// 享元工厂类
class FlyweightFactory
{
private $flyweights = [];
public function getFlyweight($state)
{
if (!isset($this->flyweights[$state])) {
$this->flyweights[$state] = new ConcreteFlyweight($state);
}
return $this->flyweights[$state];
}
}
// 客户端代码
$factory = new FlyweightFactory();
$flyweight1 = $factory->getFlyweight("state1");
$flyweight1->operation();
$flyweight2 = $factory->getFlyweight("state2");
$flyweight2->operation();
$flyweight3 = $factory->getFlyweight("state1");
$flyweight3->operation();
在上面的实现中,我们首先定义了一个享元接口,并在具体享元类中实现了它。然后,我们定义了一个享元工厂类,它维护了一个享元对象的池子。最后,我们在客户端代码中实例化了享元工厂类,并通过调用getFlyweight
方法来获取享元对象,并展示了它们的行为。
享元模式的使用
<?php
$factory = new FlyweightFactory();
$flyweight1 = $factory->getFlyweight("state1");
$flyweight1->operation();
$flyweight2 = $factory->getFlyweight("state2");
$flyweight2->operation();
$flyweight3 = $factory->getFlyweight("state1");
$flyweight3->operation();
在上面的使用中,我们实例化了一个享元工厂类,并通过调用getFlyweight
方法来获取享元对象,并展示了它们的行为。
总结
享元模式是一种非常常见的结构型模式,它通过共享对象来减少系统中的对象数量,从而降低了内存的使用和系统的复杂度。在实际开发中,我们可以根据具体的需求,选择不同的共享对象来组合成一个享元类,从而实现对系统的优化。
来源:https://blog.csdn.net/weixin_39934453/article/details/129723823
0
投稿
猜你喜欢
- 功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务
- 在过去的两年里,你能想象的一些很烂的应用设计也入驻了优雅的iPhone。通过它周边的宣传,使得世界各地的设计者们都利用这个新的移动工具来一展
- 之前我写过一篇文章介绍如何实现中国站长站的文章干扰码功能:《谈中国站长站的文章干扰码实现方法》 首发在asp之家。如果大家有兴趣可以先看看。
- 尽管现代浏览器已经支持了众多的CSS3属性,但是大部分设计师和开发人员貌似依然在关注于一些很“主流”的属性,如border-radius、b
- SQL Server 2000安装问题集锦1、先把SQL Server卸载(卸载不掉也没有关系,继续下面的操作)2、把Microsoft S
- 建立随机生成的HTML代码是一件相当容易实现的ASP特性。你可能创建过“每日一帖”、滚动广告等等,只需要稍加点缀就会令你的网站日久弥新。对存
- 连接数据库:mysql -u用户名 -p密码导入数据 source d:\create.sql用下面的语句就可以导出mysql中的数据了:m
- 强大的group by 代码如下:select stdname, isnull(sum( case stdsubject whe
- 写过稍微大型一点 ASP 的人都知道,Session 这个对象真是好用,它可以用来记录使用者私有的资料变量,既安全又方便。但是你真的知道 S
- 在学习与运用ASP中,response对象涉及到的方面也比较多,想全部都掌握也并非一两天的事,我也是最近才发现response对象中居然有这
- MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之
- 有时候,规划师(或需求、交互)把内容呈现的框架草图搭建好后,就直接“丢”给了设计师,让设计师在画好的框架里去美化内容,出来后的效果,往往达不
- “你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起
- <% class menusPublic Title, ID, Image, TitleColor, Target, Backgrou
- YAHOO.util.Subscriber 与 YAHOO.util.CustomEvent。1. YAHOO
- 利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。1、创建保存备份文件的路径/mysqldata#mkdi
- 尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一
- 用字符串就可以轻松地获取每一个文件的名称和扩展名,但不要乱用:<%Function getFilename(text)tex
- 一个什么都不懂的家伙非跟我要个sql查询器 随便写了一个,当然为了数据安全,要过滤掉一个sql关键词和系统中的一些表了 哦,对了,里面的一些
- 昨天去面试,百度题果然不一样,笔试我就蒙了,现在能记住两道题,笔试:1、title和alt 区别2、三列布局 左边裂固定宽度左对齐,右边列固