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.htmlhttps://www.jmsite.cn/blog-822.htmlhttps://www.jb51.net/article/122322.htm(感谢分享)

 

 




posted @ 2019-11-06 11:08  北往星辰  阅读(645)  评论(0编辑  收藏  举报