• 设计模式


    单例模式

    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 }
  • 相关阅读:
    JS写游戏
    为运算表达式设计优先级
    原子的数量
    二叉搜索树的范围和
    所有可能的满二叉树
    有效的井字游戏
    站在对象模型的尖端
    执行期语意学
    构造、析构、拷贝语意学
    [CSP-S模拟测试]:序列(二分答案+树状数组)
  • 原文地址:https://www.cnblogs.com/mfBlog/p/10621159.html
Copyright © 2020-2023  润新知