zoukankan      html  css  js  c++  java
  • 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
    ";
        }
        public function setName($name)
        {
            // TODO: Implement setName() method.
        }
    }
    class Worker2 implements IWorker
    {
        public function getName()
        {
            // TODO: Implement getName() method.
            return "my name is name2
    ";
        }
        public function setName($name)
        {
            // TODO: Implement setName() method.
        }
    }
    class Worker3 implements IWorker
    {
        public function getName()
        {
            // TODO: Implement getName() method.
            return "my name is name3
    ";
        }
        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(感谢分享)

     

     




  • 相关阅读:
    hiho #1502:最大子矩阵(元素和不超过k)
    IPC 进程间通信方式——消息队列
    IPC 进程间通信方式——共享内存
    IPC 进程间通信方式——管道
    hiho #1032: 最长回文子串
    TCP超时与重传机制与拥塞避免
    C++关于构造函数 和 析构函数 能否抛出异常的讨论
    基于TCP的客户端、服务器端socket编程
    hiho #1043 : 完全背包
    hiho #1485 : hiho字符串(滑动窗口)
  • 原文地址:https://www.cnblogs.com/luqiang213917/p/11803921.html
Copyright © 2011-2022 走看看