面试常见问题-设计模式

April 12th 2019 | 日常

  • 你所知道的设计模式有哪些?
    单例模式、工厂模式、抽象工厂模式、策略模式、观察者模式、责任链模式、适配器模式、命令模式
  • 设计模式
       在PHP中,我主要使用了以下两种设计模式
    1、单例模式
    单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
    单例模式的要点有三个:
    一是某个类只能有一个实例;
    二是它必须自行创建这个实例;
    三是它必须自行向整个系统提供这个实例。
    典型的代表如框架中的基类对象。
    2、简单工厂模式
    1抽象基类:类中定义抽象一些方法,用以在子类中实现
    2继承自抽象基类的子类:实现基类中的抽象方法
    3工厂类:用以实例化所有相对应的子类
        这种我们使用最常见,基本所有的MVC框架中都是这样产生的。
  • 单例模式,创建mysqli数据库链接的单例对象 

/**

  • 单例模式,创建mysqli数据库链接的单例对象
  • */

class Db
{

private static $instance;
public $handle;

private function __construct($host, $username, $password, $dbname)
{

    $this->handle = null;
    $this->getcon($host, $username, $password, $dbname);
}

public static function getBb()
{

    self::$instance = new Db();
    return self::$instance;
}

private function getcon($host, $username, $password, $dbname)
{

    if ($this->handle != null) {

        return true;
    }
    $this->handle = mysqli_connect($host, $username, $password, $dbname);
}

}

- 手写单例模式怎么写

// 三私一公。
class Example
{
//保存例实例在此属性中
private static $_instance;

//构造函数声明为private,防止直接创建对象
private function __construct()
{
echo 'I am Construceted';
}

//单例方法
public static function singleton()
{
if (!isset(self::$_instance)) {
$c = CLASS;
self::$_instance = new $c;
}
return self::$_instance;
}

//阻止用户复制对象实例
public function __clone()
{
trigger_error('Clone is not allow', E_USER_ERROR);
}

function test()
{
    echo("test");

}

}

// 这个写法会出错,因为构造方法被声明为private
$test = new Example;

// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;