zoukankan      html  css  js  c++  java
  • 工厂模式

    如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个php代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。

    工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

    使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合

    要使用的不同方法:

    <?php 
    //eg1
    class Test1{
        static function test(){
            echo __FILE__;
        }
    }
    
    
    //eg2
    require_once('people.php');
    class man implements people{
        public function say(){
            echo '<br>我是man<br>';
        }
        public function read(){
            
        }
    }
    
    class women implements people{
        public function say(){
            echo '我是women<br>';
        }
        public function read(){
            
        }
    }
    ?>

    定义工厂类:

    <?php 
    require_once('test.php');
    
    //eg1
    class Factory{
        static function createDatabase(){
            $test = new Test1();
            return $test;
        }
    }
    
    
    //eg2
    class SimpleFactory{
        //简单工厂里的静态方法-用于创建男人对象
        static function createMan(){
            return new man();
        }
    
        //简单工厂里的静态方法-用于创建女人对象
        static function createWomen(){
            return new women();
        }
    }
    ?>

    定义eg2的接口:

    <?php 
    /**
     * eg2
     * Interface people
     */
    interface people{
        public function say();
        public function read();
    }
    
    ?>

    执行代码:

    <?php 
    /**
     * 具体调用
     */
    require_once('Factory.php');
    //eg1
    $test = Factory::createDatabase();
    $test->test();
    
    //eg2
    if(isset($_GET['male'])){
        echo '1<br>';
        $man = SimpleFactory::createMan();
    }else{
        echo '2<br>';
        $man = SimpleFactory::createWomen();
    }
    $man->say();
    
    ?>

    eg2使用了interface接口,

    接口是规定某类必须实现接口中定义的方法,通过关键字interface定义,但是接口中不需要定义方法的具体内容,既不需要有方法体。且,所有的方法都必须是公共的(public)。

    好处是规范,每个类都统一。平级的类都必须实现接口中的方法,只是实现的方式不一样。

    使用的规范是:

      不能实例化,只能通过implements来声明。使用‘,’间隔,可以声明多个接口。

      接口中的属性必须是常量。

      接口中的方法必须是public,且没有方法体

      接口间可以互相继承

  • 相关阅读:
    Linux 文件 目录结构探索
    实践 : Ubuntu 上 Testlink 部署
    Linux 查找安装包所在目录的常用方法
    selenium + python 测试环境搭建 (WINDOWS)
    EntityFramework 学习 一 Entity Framework结构体系
    castle windsor学习-------Container Events 容器的事件
    castle windsor学习----ComponentModel construction contributors
    castle windsor学习----- CastleComponentAttribute 特性注册
    castle windsor学习-----Inline dependencies 依赖
    castle windsor学习-----Registering components by conventions
  • 原文地址:https://www.cnblogs.com/two-bees/p/10599122.html
Copyright © 2011-2022 走看看