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]);
}
自己总结:说白了单例模式就是类再代码中只实例化对象一次,就不需要再进行实例化了,节省了资源和内存的损耗。
php模式的设计的更多相关文章
- 以DDD为开发模式的设计开发步骤可以是
以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦
精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...
- 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式
1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)
MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 1)
初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...
- Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 2)
MVVM回顾 经过上一篇文章的介绍,相信你对MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在. View只关心怎样渲染,而ViewModel只 ...
- Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)
初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...
- go案例:客户管理系统流程 mvc模式 分层设计
下面是一个简要的客服系统,主要是演示分层计.. model : 数据部份: package model import "fmt" //声明一个结构体,表示一个客户信息 type C ...
随机推荐
- Nginx网络压缩 CSS压缩 图片压缩 JSON压缩
一.序言 使用Nginx作为web应用服务时,会代理如下常见文件:js.css.JSON.图片等,本文提供基于Nginx内置的压缩技术,提供网络请求响应速度的解决方案. 1.网络压缩原理 网络压缩的原 ...
- .NET Core分析程序集最优美的方法,不用Assembly.LoadFile(),超越ReflectionOnlyLoad
在编写.NET程序的时候,如果需要对一个程序集文件进行分析,我们可以使用Assembly.LoadFile()来加载这个程序集,然后对LoadFile()方法返回的Assembly对象进行进一步的分析 ...
- JavaCV的摄像头实战之五:推流
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- ABC222 部分简要题解
G 这个问题不好直接做,考虑转化为一个好求的问题. 原问题等价于求最小的 \(x\) 使得(或判断无解): \[\begin{aligned} \frac{2}{9}(10 ^ x - 1) & ...
- ABC182 F Valid payments
解法一 首先不妨来思考一下怎样的一个付钱方案是最优的,假设需要支付 \(Y\) 元,第 \(a_i\) 种钱币支付了 \(s_i\) 张,那么必须有:\(s_i < \frac{a_{i + 1 ...
- vi/vim 设置.vimrc(/etc/vim | $HOME)
转载请注明来源:https://www.cnblogs.com/hookjc/ "====================================================== ...
- n次单位根(n-th unit root)
最近在看CKKS方案,里面的编码/解码用到了n次单位根,感觉基于环上的加密,很多都会用到,现在系统的学习一下! 定义 先看定义: \[z^n=1,(n=1,2,3,...) \] 该方程的根z为n次单 ...
- IDA FLIRT使用
IDA FLIRT/FLAIR FLIRT是IDA提供的一种函数识别技术,即库文件快速识别与鉴定技术(Fast Library Identification and Recognition Tec ...
- 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!
开心一刻 那天知道她结婚了,我整整一个晚上没睡觉,开了三百公里的车来到她家楼下,缓缓的抽了一支烟...... 天渐渐凉了,响起了鞭炮声,迎亲车队到了,那天披着婚纱的她很美,真的很美! 我跟着迎亲车队开 ...
- 如何在TypeScript/JavaScript项目里引入MD5校验和
摘要:MD5校验和则是其中一种数学算法,通常是使用工具对文件计算得出的一组32 个字符的十六进制字母和数字. 本文分享自华为云社区<TypeScript/JavaScript项目里如何做MD5校 ...