工厂模式是我们最常用的实例化对象模式,是用工厂方法代替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. ApacheCN 深度学习译文集 20201229 更新

    新增了七个教程: TensorFlow 和 Keras 应用开发入门 零.前言 一.神经网络和深度学习简介 二.模型架构 三.模型评估和优化 四.产品化 TensorFlow 图像深度学习实用指南 零 ...

  2. ForkJoinPool简单使用

    简介 ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个"小任务",把多个"小任务"放到多个处理器核心上并行执行, ...

  3. IDE连接数据库时测试Test Connection 无法点击

    问题: IDE连接数据库时测试Test Connection 无法点击 解决: IDE缺少对应的驱动 第一步: 点击驱动 第二步: 下载驱动 注意:不同版本的驱动下载位置不同,此版本为2017

  4. 淘大大出了composer镜像 -- 给力

    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

  5. PHP中的单引号跟双引号的区别

    不同点: 单引号只能解析转义字符"'"和"\",其他的原样输出.

  6. JAVA面向对象特征详解

    1. 封装 封装性的产生目的:保护某些属性和方法不被外部所看见. 封装的实现:为属性和方法进行封装是通过关键字private声明的:实现该属性的set和get方法,为外部所访问 该公开的公开,该私有的 ...

  7. 简单的MAC的终端命令

    今天小研究了一下MAC的终端命令,主要为了方便调试程序用,XCODE用不来啊... 在这里记下..防止丢失 pwd 当前工作目录 cd(不加参数) 进root cd(folder) 进入文件夹 cd ...

  8. c++类模板与其他

    static static的成员不再单独属于一个对象,他是单独的保存在内存的某个地址,也就只有一份.所以在设计程序的时候要看这个东西是不是只需要一份. static函数和一般的函数一样,在内存中只有一 ...

  9. 深入Java微服务之网关系列1:什么是网关

    ​ 前言 近来,在想着重构一个新的产品.准备采用微服务的技术解决方案,来搭建基础设施框架.网关,是一个必不可少的组件.那么,网关到底是什么? 其又有什么特点或者特性,成为微服务必不可少的组件呢?今天, ...

  10. linux_5

    1 简述osi七层模型和TCP/IP五层模型 2 总结描述TCP三次握手四次挥手 TCP是一种可靠的,面向连接的全双工传输层协议. TCP连接的建立是一个三次握手的过程.如图所示: 第一次握手:主机A ...