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(感谢分享)