<?php
namespace app\library;
class Single
{
public $hash;
protected static $ins = null;
final protected function __construct()
{
$this->hash = rand(1, 9999);
}
public static function getInstance()
{
if (self::$ins instanceof self) {
return self::$ins;
}
self::$ins = new self();
return self::$ins;
}
}
class MyFactory
{
public static function factory()
{
return new MyObject():
}
}
$instance=MyFactory::factory();
一个稍微复杂的工厂模式:
<?php
namespace app\library;
class TransFactory
{
//以tp5为例
public static function factory($transport = 'single')
{
switch ($transport) {
case 'bus':
return new Bus();
break;
case 'car':
return new Car();
break;
case 'bike':
return new Bike();
break;
case 'single':
return Single::getInstance();
}
}
}
interface Transport
{
public function go();
}
class Bus implements Transport
{
public function go()
{
echo "bus每一站都要停";
}
}
class Car implements Transport
{
public function go()
{
echo "car跑的飞快";
}
}
class Bike implements Transport
{
public function go()
{
echo "bike比较慢";
}
}
<?php
namespace app\library;
class Register
{
//注册数模式
//结合单例和工厂
protected static $objects;
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
public static function get($alias)
{
return self::$objects[$alias];
}
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
使用
<?php
namespace app\index\controller;
use app\library\Register;
use app\library\TransFactory;
use think\Controller;
use app\library\Single;
class DesignController extends Controller
{
//设施模式
//单例
public function single()
{
$ins = Single::getInstance();
dump($ins);
}
//工厂
public function factory()
{
$fac = TransFactory::factory('bus');
$fac->go();
}
//注册数
public function register()
{
Register::set('rand', TransFactory::factory());
$obj = Register::get('rand');
dump($obj);
}
}
abstract class Toy
{
public abstract function openMouth();
public abstract function closeMouth();
//为红枣遥控公司控制接口增加doMouthOpen方法
public abstract function doMouthOpen();
//为红枣遥控公司控制接口增加doMouthClose方法
public abstract function doMouthClose();
}
class Dog extends Toy
{
public function openMouth()
{
echo "Dog open Mouth\n";
}
public function closeMouth()
{
echo "Dog open Mouth\n";
}
//增加的方法
public function doMouthOpen()
{
$this->doMouthOpen();
}
//增加的方法
public function doMouthClose()
{
$this->closeMouth();
}
}
class Cat extends Toy
{
public function openMouth()
{
echo "Cat open Mouth\n";
}
public function closeMouth()
{
echo "Cat open Mouth\n";
}
//增加的方法
public function doMouthOpen()
{
$this->doMouthOpen();
}
//增加的方法
public function doMouthClose()
{
$this->closeMouth();
}
}
abstract class Toy
{
public abstract function openMouth();
public abstract function closeMouth();
public abstract function doMouthOpen();
public abstract function doMouthClose();
//为绿枣遥控公司控制接口增加doMouthClose方法
public abstract function operateMouth($type = 0);
}
class Dog extends Toy
{
public function openMouth()
{
echo "Dog open Mouth\n";
}
public function closeMouth()
{
echo "Dog open Mouth\n";
}
public function doMouthOpen()
{
$this->doMouthOpen();
}
public function doMouthClose()
{
$this->closeMouth();
}
public function operateMouth($type = 0)
{
if ($type == 0) {
$this->closeMouth();
} else {
$this->operateMouth();
}
}
}
class Cat extends Toy
{
public function openMouth()
{
echo "Cat open Mouth\n";
}
public function closeMouth()
{
echo "Cat open Mouth\n";
}
public function doMouthOpen()
{
$this->doMouthOpen();
}
public function doMouthClose()
{
$this->closeMouth();
}
public function operateMouth($type = 0)
{
if ($type == 0) {
$this->closeMouth();
} else {
$this->operateMouth();
}
}
}
<?php
abstract class Toy
{
public abstract function openMouth();
public abstract function closeMouth();
}
class Dog extends Toy
{
public function openMouth()
{
echo "Dog open Mouth\n";
}
public function closeMouth()
{
echo "Dog close Mouth\n";
}
}
class Cat extends Toy
{
public function openMouth()
{
echo "Cat open Mouth\n";
}
public function closeMouth()
{
echo "Cat close Mouth\n";
}
}
//目标角色:红枣遥控公司
interface RedTarget
{
public function doMouthOpen();
public function doMouthClose();
}
//目标角色:绿枣遥控公司及
interface GreenTarget
{
public function operateMouth($type = 0);
}
//类适配器角色:红枣遥控公司
class RedAdapter implements RedTarget
{
private $adaptee;
function __construct(Toy $adaptee)
{
$this->adaptee = $adaptee;
}
//委派调用Adaptee的sampleMethod1方法
public function doMouthOpen()
{
$this->adaptee->openMouth();
}
public function doMouthClose()
{
$this->adaptee->closeMouth();
}
}
//类适配器角色:绿枣遥控公司
class GreenAdapter implements GreenTarget
{
private $adaptee;
function __construct(Toy $adaptee)
{
$this->adaptee = $adaptee;
}
//委派调用Adaptee:GreenTarget的operateMouth方法
public function operateMouth($type = 0)
{
if ($type) {
$this->adaptee->openMouth();
} else {
$this->adaptee->closeMouth();
}
}
}
class testDriver
{
public function run()
{
//实例化一只狗玩具
$adaptee_dog = new Dog();
echo "给狗套上红枣适配器\n";
$adapter_red = new RedAdapter($adaptee_dog);
//张嘴
$adapter_red->doMouthOpen();
//闭嘴
$adapter_red->doMouthClose();
echo "给狗套上绿枣适配器\n";
$adapter_green = new GreenAdapter($adaptee_dog);
//张嘴
$adapter_green->operateMouth(1);
//闭嘴
$adapter_green->operateMouth(0);
}
}
$test = new testDriver();
$test->run();
<?php
// 主题接口
interface Subject{
public function register(Observer $observer);
public function notify();
}
// 观察者接口
interface Observer{
public function watch();
}
// 主题
class Action implements Subject{
public $_observers=array();
public function register(Observer $observer){
$this->_observers[]=$observer;
}
public function notify(){
foreach ($this->_observers as $observer) {
$observer->watch();
}
}
}
// 观察者
class Cat implements Observer{
public function watch(){
echo "Cat watches TV<hr/>";
}
}
class Dog implements Observer{
public function watch(){
echo "Dog watches TV<hr/>";
}
}
class People implements Observer{
public function watch(){
echo "People watches TV<hr/>";
}
}
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();