一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:
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(感谢分享)