php单列模式和工厂模式

☆樱花仙子☆ 提交于 2019-12-03 17:03:42

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

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

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!