zoukankan      html  css  js  c++  java
  • php 设计模式 (单例+工厂)

    1什么是设计模式?

    1.1 设计模式是代码设计经验的总结。可以加快开发速度。
    1.2 好处:代码重用,方便后期维护。

    2常用的设计模式。
    > 2.1. 单例设计模式:一个列只能创建一个对象,不管用什么方法,都无法创建第2个对象。如:数据库
    >2.2 工厂设计模式:根据传递的不同的类名,生产不同类的对象的工厂。

    3单例模式设计要求(三私一公)
    >3.1私有的静态的保存对象的属性。

    3.2私有的构造方法,阻止类外new对象。
    3.3私有的克隆方法,阻止类外clone对象。

    4单例举例说明:

    <?php
    class  Student{
        //私有的静态的保存对象的属性。
        private  static  $obj = NULL;
    
        //私有的构造方法:阻止类外new对象
        private function __construct(){}
    
        //私有的克隆方法:阻止类外clone对象
        private function __clone(){}
    
        //公共的静态的创建对象的方法
        public static function getInstance()
        {
            //判断当前对象是否存在
            if(!self::$obj  instanceof self)
            {
                //如果当前对象不存在,则创建它
                self::$obj = new  self;
            }
            // 返回对象
            return self::$obj;
        }
    }
    
    //测试是否是单例
    $obj1 = Student::getInstance();
    $obj2 = Student::getInstance();
    var_dump($obj1,$obj2);
    
    /**
     * instanceof  判断当前对象是不是某个类的对象,如果是某个类的对象,则返回true;
     * 否则返回false。
     * 
     * 语法   $obj  instanceof    className
     */
    

    这里写图片描述

    工厂设计模式

    什么是工厂模式

    根据传递的不同类名参数,来创建不同类的对象。实现创建不同类的对象的统一方式。

    2工厂模式的设计要求

    定义一个工厂类,例如:Factory.class.php
    公共的静态的创建不同类的对象的方法。
    该方法有一个唯一的类名参数。
    向外部返回创建类的对象。
    提示:工厂类本省不创建对象 。
    注意:使用工厂类创建的对象的构造的方法都不能带参数。

    举例说明

    1. list.php文件的代码
    <?php
    
    // (1) 类的自动加载
    spl_autoload_register(function($className){
       //构建类文件的真实路径
        $filename = "./libs/$className.class.php";
        //如果类文件存在,则包含
        if(file_exists($filename)) require_once($filename);
    });
    
    //(2) 创建学生类对象
    $stuObj = Factory::getInstance("Student");
    
    // (3)创建教师类对象
    $teaObj = Factory::getInstance("Teacher");
    

    2.Factory.class.php 工厂类的文件代码

    <?php
    
    //定义最终的工厂类
    final class Factory
    {
        //公共的静态的创建不同类对象的方法
        public static function getInstance($className)
        {
            //创建不同类的对象,并返回
            return  new $className();
        }
    }
    

    (3)Student.class.php学生类文件代码

    <?php
    
    //定义最终的学生类
    final  class Student
    {
        private $name = "张三丰";
        private $age = 24;
        public function __construct()
        {
            echo "{$this->name}学生年龄是{$this->age}岁";
        }
    }
    
    
    

    (4) Teacher.class.php教师类的文件代码

    //定义最终的教师类
    final class Teacher
    {
        private $name = "张三疯";
        private $school = "美国斯坦福大学";
    
        public function __construct()
        {
            echo "{$this->name}老师毕业于{$this->school}";
        }
    }
    
  • 相关阅读:
    Labshare 生物信息学在线软件集锦
    为什么要给单个细胞测序?
    两行代码解决Android9.0 CLEARTEXT communication not supported: [ConnectionSpec...
    Android 网络框架:Retrofit2一篇就够了(2020-4-23)
    Android通用流行框架大全
    base64图片裁剪空白区域
    常用的几款抓包工具
    Message: 'chromedriver' executable needs to be in PATH
    nginx+lua+redis做访问鉴权
    win10安装markdownpad2打开显示错误this view has crashed!
  • 原文地址:https://www.cnblogs.com/liuqun/p/12655253.html
Copyright © 2011-2022 走看看