php模式的设计
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法可以任意命名这个静态还可以接受任意数据的参数,必须返回一个对象。
很多没接触过工厂模式的人会不禁问,为啥我要费那么大的劲儿去构造工厂类去创建对象呢?不去套用那些易维护,可扩展之类的话,我们可以考虑这样 一个简单的问题。如果项目中,我们通过一个类创建对象。在快完成或者已经完成,要扩展功能的时候,发现原来的类类名不是很合适或者发现类需要添加构造函数 参数才能实现功能扩展。我靠!我都通过这个类创建了一大堆对象实例了啊,难道我还要一个一个去改不成?我们现在才感受到了“高内聚低耦合”的博大精深。没 问题,工厂方法可以解决这个问题。
如果类名发生变化,或者方法的参数发生变化,需要修改所有引入该类的文件,不易于维护,紧耦合。我们要解决这个问题,所以要使用工厂方法。
工厂模式更多的是解决后期拓展(大部分是文件命名修改后)的问题。
自我总结:工厂类模式实际上就是方便修改我们所创建的模型名称;打一个比方,比如我们写了一个图片收藏的模型,那我们肯定
要在MVC 三层架构上进行所谓的curd ;我们就新建一个Image 的 模型,再控制器层中我们肯定要不管是静态的还是实例化
那么我们要进行增删改查;进的调用4回Image模型;万一我们要就行修改Image的名字;那程序不就乱套啦
所以说白了,工厂模式实际上就是为程序员修改模型名称提供便利;接下来我实现一个简单的工厂模式:
1: 再模型层中新建一个工厂模式模型:
2:我们可以再这个模型里进行实例化模型:这里注意的是必须是公开的静态的方法 可以不用继承model
/** * 工厂模式 */ public static function createFactory(){ //这里进行实例化我们想要的模型类名 $image=new Images(); return $image; }
那么再控制器中我们就可以执行一系列的增删改查:我们只需要调用工厂类名::方法名称即可实例化这个模型,进行CURD
如果我们要修改模型类名;我们只需要进行这里的模型名称和模型名称和外部的文件名称啦。
修改Images为Image 我们进行添加测试。添加成功:
1: 单例模式的实现:
单例模式更多的是解决内存开销(new 类),同样也是为了代码美观吧
2、应用场景
一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的 new 操作,因为每一次 new 操作都会消耗内存资源和系统资源。 如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.
要点
- 一个类只能有一个对象
- 必须是自行创建这个类的对象
- 要想整个系统提供这一个对象
具体实现的重点
- 单例模式的类只提供私有的构造函数,
- 类定义中含有一个该类的静态私有对象,
- 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
代码测试:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Image extends Model { /** * 单例模式的实现 * 三私一公 */ // 私有的静态属性 private static $_instance = null; //私有的构造方法 private function __construct() { echo "单例模式的实例被构造了"; } //私有的克隆方法 private function __clone() { } //公有化获取实例方法 public static function getInstance() { // 进行判断 如果当前类被实例化,我们就返回对象,否则就重新实例化这个类 if (self::$_instance) { return self::$_instance; } self::$_instance = new self(); return self::$_instance; } }
控制器进行调用:
public function details(Request $request) { //处理房源图片(5分) $image=$request->file('image')->store(date('Y-m-d').'/'.'img'); //处理房东图片(5分) $landlady_image=$request->file('landlady_image')->store(date('Y-m-d').'/'.'landlady_image'); $data=[ 'image'=>$image, 'landlady_image'=>$landlady_image ]; $model=Image::getInstance(); $result=$model->insertGetId($data); return response()->json(['code'=>200,'message'=>'success','data'=>$result]); }
自己总结:说白了单例模式就是类再代码中只实例化对象一次,就不需要再进行实例化了,节省了资源和内存的损耗。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现