工厂:使用工厂类的静态方法新建需要的对象 然后在外面直接调用静态方法新建对象
<?php
//要创建对象实例的类
class MyObject{
}
//工厂类
class MyFactory{
public static function factory(){
return new MyObject();
}
}
$instance=MyFactory::factory();
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\1.工厂.php:17:
// object(MyObject)[1]
var_dump($instance);
单例:保证一个类只生成一个对象实例 三私一公
<?php
class Single
{
private static $obj;
private function __construct()
{
}
private function __clone()
{
}
public static function getSingle()
{
if(self::$obj instanceof self){
return self::$obj;
}else{
self::$obj = new self();
return self::$obj;
}
}
}
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\2.单例.php:29:
// object(Single)[1]
$obj = Single::getSingle();
var_dump($obj);
注册树:使用静态变量数组进行存取对象
<?php
class Obj{
public static function newObj(){
return new self();
}
}
class Register
{
public static $tree;
public static function set($alias,$obj){
return self::$tree[$alias] = $obj;
}
public static function get($alias){
return self::$tree[$alias];
}
}
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\3.注册树.php:25:
// object(Obj)[1]
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\3.注册树.php:28:
// object(Obj)[1]
$set = Register::set('rand',Obj::newObj());
var_dump($set);
$get = Register::get('rand');
var_dump($get);
适配器:三个概念 主体 受体 适配器
受体想要使用主体 但是没法连接起来,就抽离出来一个适配器,
适配器可以获取定义主体的方法,受体可以从适配器获取主体的信息方法,从容达到了间接连接;
主体使用interface进行定义 ;
适配器inplements主体,重新定义主体声明但没有描述的方法;
受体:受体赋值在适配器中的静态变量中,受体就可以使用适配器的所有额方法了
我们通过调用适配器的方法 就可以使用受体的方法属性,也可以使用适配器的方法属性
其实也就是你家墙上有一个两口的插座(Adaptee),但你买了一个电风扇(Target)需要三个口的,这个时候
你就需要一个插排(Adapter)。
适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容
的类可以合作无间。
我们直接可以在适配器中进行丰富方法
从而
方法与受体有重叠 可以使用受体的方法
受体没有的方法 我们可以在适配器中进行丰富!
这样就可以减少主体的改动!全部在受体与适配器中进行丰富方法!
<?php
/**
* 目标角色
*/
interface Target
{
/**
* 源类也有的方法1
*/
public function sampleMethod1();
/**
* 源类没有的方法2
*/
public function sampleMethod2();
}
/**
* 源角色
*/
class Adaptee
{
/**
* 源类含有的方法
*/
public function sampleMethod1()
{
echo 'Adaptee sampleMethod1 <br />';
}
}
/**
* 类适配器角色
* 在适配器里面进行丰富主体定义的方法
*/
class Adapter implements Target
{
private $_adaptee;
public function __construct(Adaptee $adaptee)
{
$this->_adaptee = $adaptee;
}
/**
* 委派调用Adaptee的sampleMethod1方法
*/
public function sampleMethod1()
{
$this->_adaptee->sampleMethod1();
}
/**
* 源类中没有sampleMethod2方法,在此补充
*/
public function sampleMethod2()
{
echo 'Adapter sampleMethod2 <br />';
}
}
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
$one = $adapter->sampleMethod1();
var_dump($one);
$two = $adapter->sampleMethod2();
var_dump($two);
// Adaptee sampleMethod1
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\4.适配器.php:70:null
// Adapter sampleMethod2
// D:\phpstudy\PHPTutorial\WWW\phpCollection\PHPDesignPattern\4.适配器.php:72:null