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 ...
随机推荐
- SpringBoot 自定义配置
有时候需要自己定义一些配置,比如SpringBoot没有提供Druid连接池的配置,需要我们自己写配置. 以在springboot中使用Druid为例. 依赖 <dependency> & ...
- 2019年1月9日 ES6 学习心得
ES6为我们创建对象提供了新的语法糖,这就是Class语法.如果你对ES5中面向对象的方式比较熟悉的话,Class掌握起来也是非常迅速的,因为除了写法的不同,它并不会增加新的难以理解的知识点.我们先利 ...
- git reset HEAD 与 git reset --hard HEAD的区别
感谢原文作者:天地逍遥 原文链接:https://www.jianshu.com/p/aeb50b94e6c0 git reset HEAD 是将咱暂存区和HEAD的提交保持一致 git reset ...
- php截取字符串,避免乱码
转载请注明来源:https://www.cnblogs.com/hookjc/ 1. 截取GB2312中文字符串 <?php//截取中文字符串 function mysubstr($str, $ ...
- JScrollPane 自动跟进 自动到滚动到最底部
感谢大佬:https://blog.csdn.net/csdn_lqr/article/details/51068423 注:以下方法为网上摘抄 1 . JTable( 放在JScrollPane中 ...
- bootstrap移动 pc 响应轮播
PC端效果 width100% 移动端 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...
- 解压命令tar zxvf中zxvf分别是什么意思
x : 从 tar 包中把文件提取出来z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压v : 显示详细信息f xxx.tar.gz : 指定被处理的文件是 xxx ...
- CheckStyle使用手册(一)
介绍 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代码规范检查过程,从 而使得开发人员从这项重要,但是枯燥的任务中解脱出 ...
- vue中的钩子函数
什么是vue的钩子函数? Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vue实例初始化的不同阶段添加自己的代码,以 ...
- 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版
技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...