一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:

1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法

单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

简单的单列模式:

class RedisService
{
/**
* 类对象实例数组,共有静态变量
* @var null
*/
private static $_instance;

/**
* 私有化构造函数,防止类外实例化
* RedisConnect constructor.
*/
private function __construct()
{

}

/**
* 单例方法,用于访问实例的公共的静态方法
* @return \Redis
* @static
*/
public static function getInstance()
{

if (!(self::$_instance instanceof \Redis)) {
self::$_instance = new \Redis();
self::$_instance->connect('127.0.0.1',6379);
}
return self::$_instance;
}

/**
* 私有化克隆函数,防止类外克隆对象
*/
private function __clone()
{
// TODO: Implement __clone() method.
}
}

使用:

<?php

RedisService::getInstance()->hSet('user',1,'张三');
$name = RedisService::getInstance()->hGet('user',1);
var_dump($name);

二、工厂模式就是一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new;是用工厂方法代替new操作产生实例的一种模式; 这样如果想更改创建的对象类型,只需更改该工厂即可。

使用工厂模式的好处是,类实例化在工厂类中进行,如果你想要更改所实例化的类名和参数等,则只需更改该工厂方法代码即可;工厂模式为系统结构提供灵活的动态扩展机制,减少了耦合性

 定义一个接口类,并将其实现

<?php

interface IWorker
{
public function getName();
} class Worker1 implements IWorker
{
public function getName()
{
// TODO: Implement getName() method.
return "my name is name1\n";
}
public function setName($name)
{
// TODO: Implement setName() method.
}
}
class Worker2 implements IWorker
{
public function getName()
{
// TODO: Implement getName() method.
return "my name is name2\n";
}
public function setName($name)
{
// TODO: Implement setName() method.
}
}
class Worker3 implements IWorker
{
public function getName()
{
// TODO: Implement getName() method.
return "my name is name3\n";
}
public function setName($name)
{
// TODO: Implement setName() method.
}
}

实现简单工厂:
<?php

class SimpleFactory
{
public static function getWorker($workerName)
{
if ($workerName == 1){
return new Worker1();
} elseif ($workerName == 2){
return new Worker2();
} elseif ($workerName == 3){
return new Worker3();
}
}
}


测试:
<?php

$worker1 = SimpleFactory::getWorker(1);
echo $worker1->getName();
$worker2 = SimpleFactory::getWorker(2);
echo $worker2->getName();


输出:
my name is name1
my name is name2

实现工厂方法:
<?php

interface IFactory
{
public function getWorker();
}
class Worker1Factory implements IFactory
{
public function getWorker()
{
// TODO: Implement getWorker() method.
return new Worker1();
}
}
class Worker2Factory implements IFactory
{
public function getWorker()
{
// TODO: Implement getWorker() method.
return new Worker2();
}
}

测试工厂方法:
<?php

$worker1Factory = new Worker1Factory();
echo $worker1Factory->getWorker()->getName();
$worker2Factory = new Worker2Factory();
echo $worker2Factory->getWorker()->getName();

输出:
my name is name1
my name is name2
参考链接:https://www.jmsite.cn/blog-827.htmlhttps://www.jmsite.cn/blog-822.htmlhttps://www.jb51.net/article/122322.htm(感谢分享)

 

php单列模式和工厂模式的更多相关文章

  1. php基础设计模式 注册树模式、工厂模式、单列模式

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...

  2. javascript模式 (3)——工厂模式和装饰模式

    上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...

  3. Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)

    Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...

  4. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  5. Java中设计模式之工厂模式-4

    一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...

  6. JS 简单工厂模式,工厂模式(二)

    一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...

  7. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

  8. C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

    一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...

  9. Java模式—简单工厂模式

    简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...

  10. python 使用模板模式和工厂模式的混合设计开发各种邮件客户端发送邮件

    1.使用模板模式和工厂模式的混合设计开发各种邮件客户端发送邮件. 2.模板模式的目的:能保证快速开发各种邮箱客户端,子类只需要重写模板类邮箱的抽象方法即可.之后再开发任何邮箱就只要加一个类,写3行代码 ...

随机推荐

  1. Pyqt5学习笔记(一)

    Python已有的GUI框架: Tkinter(python内嵌的GUI环境,使用TCL实现,易学易用,方便简单创GUI自带无需安装,适用于Unix.Windows和Mac系统组,在Tk8.0的后续版 ...

  2. ResNet论文笔记

    其实ResNet这篇论文看了很多次了,也是近几年最火的算法模型之一,一直没整理出来(其实不是要到用可能也不会整理吧,懒字头上一把刀啊,主要是是为了将resnet作为encoder嵌入到unet架构中, ...

  3. Vue 全家桶学习资源(转)

    companion: React 全家桶学习资源(持续更新) 下面整理了一些关于Vue以及Vue衍生的学习资源: 官网文档 官网API ECMAScript 6 入门 30分钟掌握ES6/ES2015 ...

  4. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  5. PTA 将数组中的数逆序存放

    7-1 将数组中的数逆序存放 (20 分)   本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素. 输入格式: 输入在第一行中给出一个正整数n(1). ...

  6. Java生鲜电商平台-API接口设计之token、timestamp、sign 具体设计与实现

    转载:https://www.cnblogs.com/jurendage/p/12653865.html 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安 ...

  7. JS基础学习第一天

    JavaScript JavaScript负责页面中的的行为. 它是一门运行在浏览器端的脚本语言. JS的编写的位置 1.可以编写到标签的指定属性中 12 <button onclick=&qu ...

  8. BUAA_OO_第一单元

    BUAA_OO_2020_UNIT1 一.程序结构分析 第一次作业 UML & Mertrics ​ 由于数据处理简单,第一次作业中笔者发挥了面向过程的思想,将项转换成Biginteger, ...

  9. python中栈的实现

    栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括 empty() – 返回栈是否为空 – Time Complexity : ...

  10. Redhat 安装gitlab

    以下为8月23日左右记录的,没有发布.今日整理大概记录下. 安装依赖包 yum install -y curl policycoreutils-python openssh-server openss ...