Fork me on GitHub

设计模式

单例模式

  1. $_instance必须声明为静态的私有变量
  2. 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
  3. getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
  4. ::操作符只能访问静态变量和静态函数
  5. new对象都会消耗内存
  6. 使用场景:最常用的地方是数据库连接。
  7. 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
  8. 私有的__clone()方法防止克隆对象

单例模式,使某个类的对象仅允许创建一个。构造函数private修饰, 
申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。

 1 <?php
 2 
 3 /**
 4  * Singleton class[单例模式]
 5  * @author ITYangs<ityangs@163.com>
 6  */
 7 final class Mysql
 8 {
 9 
10     /**
11      *
12      * @var self[该属性用来保存实例]
13      */
14     private static $instance;
15 
16     /**
17      *
18      * @var mixed
19      */
20     public $mix;
21 
22     /**
23      * Return self instance[创建一个用来实例化对象的方法]
24      *
25      * @return self
26      */
27     public static function getInstance()
28     {
29         if (! (self::$instance instanceof self)) {
30             self::$instance = new self();
31         }
32         return self::$instance;
33     }
34 
35     /**
36      * 构造函数为private,防止创建对象
37      */
38     private function __construct()
39     {}
40 
41     /**
42      * 防止对象被复制
43      */
44     private function __clone()
45     {
46         trigger_error('Clone is not allowed !');
47     }
48 }
49 
50 // @test
51 $firstMysql = Mysql::getInstance();
52 $secondMysql = Mysql::getInstance();
53 
54 $firstMysql->mix = 'ityangs_one';
55 $secondMysql->mix = 'ityangs_two';
56 
57 print_r($firstMysql->mix);
58 // 输出: ityangs_two
59 print_r($secondMysql->mix);
60 // 输出: ityangs_two

Test1.php

1 <?php
2 class Test1{
3     static function test(){
4         echo __FILE__;
5     }
6 }

Factory.php

 1 <?php
 2 class Factory{
 3     /*
 4      * 如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字
 5      * 发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个PHP
 6      * 代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。
 7      */
 8     static function createDatabase(){
 9         $test = new Test1();
10         return $test;
11     }
12 }

Test.php

 1 <?php
 2 spl_autoload_register('autoload1');
 3 
 4 $test = Factory::createDatabase();
 5 $test->test();
 6 function autoload1($class){
 7     $dir  = __DIR__;
 8     $requireFile = $dir."\\".$class.".php";
 9     require $requireFile;
10 }

观察者模式

1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。 
2:场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 
3:观察者模式实现了低耦合,非侵入式的通知与更新机制。 

 

定义一个事件触发抽象类。

 

EventGenerator.php

 1 <?php
 2 require_once 'Loader.php';
 3 abstract class EventGenerator{
 4     private $observers = array();
 5     function addObserver(Observer $observer){
 6         $this->observers[]=$observer;
 7     }
 8     function notify(){
 9         foreach ($this->observers as $observer){
10             $observer->update();
11         }
12     }
13 }

定义一个观察者接口

Observer.php

1 <?php
2 require_once 'Loader.php';
3 interface Observer{
4     function update();//这里就是在事件发生后要执行的逻辑
5 }

//

 1 <?php
 2 //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件
 3 require 'Loader.php';
 4 class Event extends EventGenerator{
 5     function triger(){
 6         echo "Event<br>";
 7     }
 8 }
 9 class Observer1 implements Observer{
10     function update(){
11         echo "逻辑1<br>";
12     }
13 }
14 class Observer2 implements Observer{
15     function update(){
16         echo "逻辑2<br>";
17     }
18 }
19 $event = new Event();
20 $event->addObserver(new Observer1());
21 $event->addObserver(new Observer2());
22 $event->triger();
23 $event->notify();

AbstractFactory(抽象工厂模式)

有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象工厂:

 1 <?php 
 2 class System{} 
 3 class Soft{} 
 4 
 5 class MacSystem extends System{} 
 6 class MacSoft extends Soft{} 
 7 
 8 class WinSystem extends System{} 
 9 class WinSoft extends Soft{} 
10 
11 /** * AbstractFactory class[抽象工厂模式] * @author ITYangs<ityangs@163.com> */ interface AbstractFactory {
12 public function CreateSystem(); 
13 public function CreateSoft(); 
14 } 
15 
16 class MacFactory implements AbstractFactory{ 
17 public function CreateSystem(){ 
18 return new MacSystem(); 
19 } 
20 public function CreateSoft(){ 
21 return new MacSoft(); 
22 } 
23 } 
24 class WinFactory implements AbstractFactory{ 
25 public function CreateSystem(){ 
26 return new WinSystem(); 
27 } 
28 public function CreateSoft(){ 
29 return new WinSoft(); 
30 } 
31 } 
32 //@test:创建工厂->用该工厂生产对应的对象 //创建MacFactory工厂 
33 $MacFactory_obj = new MacFactory(); 
34 //用MacFactory工厂分别创建不同对象 
35 var_dump($MacFactory_obj->CreateSystem());//输出:object(MacSystem)#2 (0) { } var_dump($MacFactory_obj->CreateSoft());// 输出:object(MacSoft)#2 (0) { }
36 
37  //创建WinFactory $WinFactory_obj = new WinFactory(); //用WinFactory工厂分别创建不同对象 
38 var_dump($WinFactory_obj->CreateSystem());//输出:object(WinSystem)#3 (0) { } var_dump($WinFactory_obj->CreateSoft());//输出:object(WinSoft)#3 (0) { }

注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

 1 <?php
 2 
 3 class Register
 4 {
 5     protected static  $objects;
 6     function set($alias,$object)//将对象注册到全局的树上
 7     {
 8         self::$objects[$alias]=$object;//将对象放到树上
 9     }
10     static function get($name){
11         return self::$objects[$name];//获取某个注册到树上的对象
12     }
13     function _unset($alias)
14     {
15         unset(self::$objects[$alias]);//移除某个注册到树上的对象。
16     }
17 }

 

posted @ 2019-03-29 14:42  陌帆  阅读(138)  评论(0编辑  收藏  举报
Live2D