工厂模式是我们最常用的实例化对象模式,是用工厂方法代替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 操作都会消耗内存资源和系统资源。 如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.

要点

  1. 一个类只能有一个对象
  2. 必须是自行创建这个类的对象
  3. 要想整个系统提供这一个对象

具体实现的重点

  1. 单例模式的类只提供私有的构造函数,
  2. 类定义中含有一个该类的静态私有对象,
  3. 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

代码测试:

<?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模式的设计的更多相关文章

  1. 以DDD为开发模式的设计开发步骤可以是

    以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...

  2. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  3. 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦

    精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...

  4. 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式

    1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ...

  5. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...

  6. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 1)

    初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...

  7. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在. View只关心怎样渲染,而ViewModel只 ...

  8. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 1)

    初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...

  9. go案例:客户管理系统流程 mvc模式 分层设计

    下面是一个简要的客服系统,主要是演示分层计.. model : 数据部份: package model import "fmt" //声明一个结构体,表示一个客户信息 type C ...

随机推荐

  1. 营销MM让我讲MySQL日志顺序读写及数据文件随机读写原理

    摘要:你知道吗,MySQL在实际工作时候的两种数据读写机制? 本文分享自华为云社区<MySQL日志顺序读写及数据文件随机读写原理>,作者:JavaEdge . MySQL在实际工作时候的两 ...

  2. AFN框架

    0.AFN框架基本使用 0.1 AFN内部结构 AFN结构体 - NSURLConnection + AFURLConnectionOperation(已经被废弃) + AFHTTPRequestOp ...

  3. StringUtils.isBlank(str)和StringUtils.isEmpty(str)的区别

    1.StringUtils.isEmpty(CharSequence cs)实现源码 public static boolean isEmpty(CharSequence cs) { return c ...

  4. git 下载及更新

    转载请注明来源:https://www.cnblogs.com/hookjc/ 在完成了创建之后,GitHub会提示你如何向这个Repository上传代码.  首次上传: Git 本地上传 添加新文 ...

  5. Java线程--BlockingQueue使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html Java线程--BlockingQueue使用 阻塞队列就是内容满了之 ...

  6. 经常使用的系统类Math、Arrays、System、BigInteger和BigDecimal以及日期类,时间戳

    一.Math 常用类: //看看Math常用的方法(静态方法)//1.abs绝对值int abs = Math . abs(-9);System. out . printLn(abs);//9//2. ...

  7. CSRF跨站请求伪造漏洞分析

    CSRF 现在的网站都有利用CSRF令牌来防止CSRF,就是在请求包的字段加一个csrf的值,防止csrf,要想利用该漏洞,要和xss组合起来,利用xss获得该csrf值,在构造的请求中将csrf值加 ...

  8. HGAME-week2-web-wp

    hgame第二周总结 1.webpack-engine 我不懂,但是真的刚打开就出来了,一脸懵逼(wp说是sourcemap没关 hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@ ...

  9. Solution -「AGC 026D」Histogram Coloring

    \(\mathcal{Description}\)   Link.   有 \(n\) 列下底对齐的方格纸排成一行,第 \(i\) 列有 \(h_i\) 个方格.将每个方格染成黑色或白色,求使得任意完 ...

  10. Solution -「LOCAL」割海成路之日

    \(\mathcal{Description}\)   OurOJ.   给定 \(n\) 个点的一棵树,有 \(1,2,3\) 三种边权.一条简单有向路径 \((s,t)\) 合法,当且仅当走过一条 ...