PHP有关的设计模式

一、单例模式

单例模式又称为职责模式,它用来在程序中创建一个对象,就是实例化出来的对象是唯一的。

基本格式(三私一公-两静态):

  1. 拥有一个private构造函数
  2. 拥有一个private的保存静态实例对象
  3. 拥有一个private的克隆方法
  4. 拥有一个创建这个实例的public的静态方法,单例类不能再其它类中直接实例化,只能被其自身实例化。

    附上自己手敲的实例

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 13:45:08
 * @Last Modified by:   huang
 * @Last Modified time: 2017-09-27 13:54:22
 */
class Student {

    private static $instance = null;

    private function __construct()
    {

    }

    private function __clone()
    {

    }

    public static function getInstance()
    {
        if(is_null(self::$instance) && !(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

$single = Student::getInstance();
var_dump($single);

$single2 = Student::getInstance();
var_dump($single2);

// $single3 = clone $single;

补充:
这里的构造方法声明为私有是为了禁止在类外通过NEW关键字实例化该类。由于getInstance是静态的方法,那么里面不能访问非静态的属性,又不想让外部访问该静态属性,因此声明为静态私有最合适不过。。

二、工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new

附上相关代码:

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 14:07:20
 * @Last Modified by:   huang
 * @Last Modified time: 2017-09-27 17:21:21
 */

abstract  class Opt{
    abstract function getValue($num1,$num2);
}

class add extends Opt{
    function getValue($num1,$num2)
    {
        echo $num1+$num2.PHP_EOL;
    }
}

class dec extends Opt{

    function getValue($num1,$num2)
    {
        echo $num1-$num2.PHP_EOL;
    }
}

class multi extends Opt{

    function getValue($num1,$num2)
    {
        echo $num1*$num2.PHP_EOL;
    }
}

class chu extends Opt{

    function getValue($num1,$num2)
    {
        if($num2 != 0){
            echo $num1/$num2.PHP_EOL;
        }
    }
}

class Factory{

    public static function make($classname)
    {
        return new $classname;
    }
}

$obj1 = Factory::make('add');
$obj1->getValue(2,1);

$obj1 = Factory::make('dec');
$obj1->getValue(2,1);

$obj1 = Factory::make('multi');
$obj1->getValue(2,1);

$obj1 = Factory::make('chu');
$obj1->getValue(2,1);

三、单例工厂模式(前面二者的混合版)

原理:通过工厂类,一个类只能生产一个对象. 将新对象存入数组,判断数组中是否有该类对象,如果有,则不会再重新创建.所以一个类只能他创建一个对象.

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 20:44:24
 * @Last Modified by:   huang
 * @Last Modified time: 2017-09-27 20:53:07
 */
class Sigle_Factory{

    private static $arr = array();

    public static function make($classname) {
        if(!isset(self::$arr[$classname])) {
            self::$arr[$classname] = new $classname;
        }
         return self::$arr[$classname];
    }
}

class A{}

class B{}

$obj1 = Sigle_Factory::make('A');
$obj2 = Sigle_Factory::make('A');

$obj3 = Sigle_Factory::make('B');
$obj4 = Sigle_Factory::make('B');

var_dump($obj1,$obj2,$obj3,$obj4);

猜你喜欢

转载自blog.csdn.net/MShuang6666/article/details/78112150