php单列模式和工厂模式
一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:
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.html,https://www.jmsite.cn/blog-822.html,https://www.jb51.net/article/122322.htm(感谢分享)
php单列模式和工厂模式的更多相关文章
- php基础设计模式 注册树模式、工厂模式、单列模式
废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...
- javascript模式 (3)——工厂模式和装饰模式
上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...
- Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)
Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- Java中设计模式之工厂模式-4
一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...
- JS 简单工厂模式,工厂模式(二)
一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...
- .Net简单工厂模式,工厂模式,抽象工厂模式实例
1.定义 简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...
- C#设计模式——简单工厂模式、工厂模式和抽象工厂模式
一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...
- Java模式—简单工厂模式
简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...
- python 使用模板模式和工厂模式的混合设计开发各种邮件客户端发送邮件
1.使用模板模式和工厂模式的混合设计开发各种邮件客户端发送邮件. 2.模板模式的目的:能保证快速开发各种邮箱客户端,子类只需要重写模板类邮箱的抽象方法即可.之后再开发任何邮箱就只要加一个类,写3行代码 ...
随机推荐
- 2019.2-2019.3 TO-DO LIST
DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...
- 搭建zabbix服务1
环境准备: 静态ip 主机名 各自配置好主机名 # hostnamectl set-hostname --static zabbixserver.cluster.com 三台都互相绑定IP与主机名 # ...
- Excel老式技术
Excel老式技术 VBS宏脚本嵌入明文代码
- LeetCode 175. Combine Two Tables 【MySQL中连接查询on和where的区别】
一.题目 175. Combine Two Tables 二.分析 连接查询的时候要考虑where和on的区别 where : 查询时,连接的时候是必须严格满足条件的,满足了才会加入到临时表中. on ...
- windows回收站无法设置
win+r运行 regedit HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 修改NoRe ...
- java例题_01 不死神兔!
1 /*1 [程序 1 不死神兔] 2 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 3 程 ...
- 结对作业-stage_2
见队友博客:结对编程-stage_2
- (十)struts2的异常处理机制
成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变 ...
- Linux实战技能,教你轻松应对85%的使用场景
在Linux实操的过程中,你在网上也能搜到一堆参考资料,但是看完之后还是会觉得似懂非懂,无法举一反三,从网上复制粘贴了事,则极有可能不起作用. 如果侥幸解决了特定的问题,也意识到自己需要系统学习一下 ...
- Julia语言程序基础
Julia-lang 新兴的Julia语言,Julia 一开始就是为高性能而设计的. Julia 程序通过 LLVM 编译成高效的多平台机器码. Julia中文社区: https://cn.julia ...