• php设计模式之工厂模式


    <?php
    
    //工厂模式的优点就在创建对象上。
    //工厂模式的优点就在创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,
    //创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。
    
    /**工厂模式我想到的一个典型的应用就是:php可能要链接mysql,也可能要链接sqlserver,还有其他什么数据库。那么做一个抽象的数据库类,
    这个类就是一个工厂类,专门负责产生不同的对象。
    这样子做很方便扩展。我们在直接链接数据库的时候,不是使用代码new Mysql($host,$username,$password,$dbname)的形式
    而可以动态生成一个连接数据库的实例。可以是mysql,也可以是连接oracle的。
    
     ***/
    //共同的接口
    interface db{
        function conn();
    }
    
    interface factory{
        function createdb();
    }
    
    
    //服务端开发(不知道将会被谁调用)
    class dbmysql implements db{
        public function conn(){
            echo "连接上了mysql;";
        }
    }
    
    class dbsqlite implements db{
        public function conn(){
            echo "连接上了sqlite;";
        }
    }
    
    
    
    class mysqlfactory implements factory{
        public function createdb(){
            return new dbmysql();
        }
    }
    
    class sqlitefactory implements factory{
        public function createdb(){
            return new dbsqlite();
        }
    }
    
    ########客户端开始#########
    $fact = new mysqlfactory();
    $db = $fact->createdb();
    $db->conn();
    
    $fact = new sqlitefactory();
    $db = $fact->createdb();
    $db->conn();
    
    看似仅仅是把创建对象的过程包装了一下,真正的变化在于"面向接口","隔离封装",
    客户端只知接口,不知具体实现.
    后端的实现,只知接口,不管前端谁调用
    工厂方法中,一个工厂生产多个零件,但零件的共同特点是--属于一个产品.
    即 此工厂可以生产产品,而非单独的对象
    /**
     *
     * 定义个抽象的类,让子类去继承实现它
     *
     */
    abstract class Operation{
    //抽象方法不能包含函数体
        abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
    }
    
    
    
    /**
     * 加法类
     */
    class OperationAdd extends Operation {
        public function getValue($num1,$num2){
            return $num1+$num2;
        }
    }
    /**
     * 减法类
     */
    class OperationSub extends Operation {
        public function getValue($num1,$num2){
            return $num1-$num2;
        }
    }
    /**
     * 乘法类
     */
    class OperationMul extends Operation {
        public function getValue($num1,$num2){
            return $num1*$num2;
        }
    }
    /**
     * 除法类
     */
    class OperationDiv extends Operation {
        public function getValue($num1,$num2){
            try {
                if ($num2==0){
                    throw new Exception("除数不能为0");
                }else {
                    return $num1/$num2;
                }
            }catch (Exception $e){
                echo "错误信息:".$e->getMessage();
            }
        }
    }
    
    /**
     * 工程类,主要用来创建对象
     * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
     *
     */
    class Factory{
        public static function createObj($operate){
            switch ($operate){
                case '+':
                    return new OperationAdd();
                    break;
                case '-':
                    return new OperationSub();
                    break;
                case '*':
                    return new OperationSub();
                    break;
                case '/':
                    return new OperationDiv();
                    break;
            }
        }
    }
    $test=Factory::createObj('/');
    $result=$test->getValue(23,0);
    echo $result;
    

      

  • 相关阅读:
    SQL分类
    简单poi读取excel
    Linux命令(2)-rm删除文件
    Linux下使用yum安装MariaDB
    linux下vi命令
    等价类划分法设计测试用例
    Linux命令(1)-创建文件
    职场面试必知:如何回答为何离开上一家公司
    软件测试的原则
    JAVA数组去除重复数据
  • 原文地址:https://www.cnblogs.com/sunlong88/p/8691484.html
Copyright © 2020-2023  润新知