一、单例模式
单例模式又称为职责模式,它用来在程序中创建一个对象,就是实例化出来的对象是唯一的。
基本格式(三私一公-两静态):
- 拥有一个private构造函数
- 拥有一个private的保存静态实例对象
- 拥有一个private的克隆方法
拥有一个创建这个实例的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);