zoukankan      html  css  js  c++  java
  • php 八大设计模式-工厂模式

    目的:

    提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤,实际上就是建立一个统一的类实例化的函数接口,完成统一调用,统一控制。

    工厂模式也分为三种:

    1. 工厂模式
    2. 抽象工厂模式

    工厂模式

    <?php 
    
    // 接口
    interface ToData {
        public function goData();
    }
    
    //字符串类
    class String implements ToData {
    
        public function goData() {
            // todo
        }
    }
    
    //Json类
    class Json implements ToData {
    
        public function goData() {
            // todo
        }
    }
    
    //xml类
    class Xml implements ToData {
    
        public function goData() {
            // todo
        }
    }
    
    //工厂类
    class Factory {
        public static function create($class) {
            return new $class;
        }
    }
    
    $typeClass = Factory::create('String');
    $typeClass->goData();
    
     ?>
     

    抽象工厂

    <?php
    /**
     * 抽象产品A
     */
    interface AbstractProductA {
    
        /**
         * 取得产品名
         */
        public function getName();
    }
    
    /**
     * 抽象产品B
     */
    interface AbstractProductB {
    
        /**
         * 取得产品名
         */
        public function getName();
    }
    
    /**
     * 具体产品A1
     */
    class ProductA1 implements AbstractProductA {
        private $_name;
    
        public function __construct() {
            $this->_name = 'product A1';
        }
    
        public function getName() {
            return $this->_name;
        }
    }
    
    
    /**
     * 具体产品A2
     */
    class ProductA2 implements AbstractProductA {
        private $_name;
    
        public function __construct() {
            $this->_name = 'product A2';
        }
    
        public function getName() {
            return $this->_name;
        }
    }
    
    
    /**
     * 具体产品B1
     */
    class ProductB1 implements AbstractProductB {
        private $_name;
    
        public function __construct() {
            $this->_name = 'product B1';
        }
    
        public function getName() {
            return $this->_name;
        }
    }
    
    /**
     * 具体产品B2
     */
    class ProductB2 implements AbstractProductB {
        private $_name;
    
        public function __construct() {
            $this->_name = 'product B2';
        }
    
        public function getName() {
            return $this->_name;
        }
    }
    
    /**
     * 抽象工厂
     */
    interface AbstractFactory {
        /**
         * 创建等级结构为A的产品的工厂方法
         */
        public function createProductA();
    
        /**
         * 创建等级结构为B的产品的工厂方法
         */
        public function createProductB();
    }
    
    /**
     * 具体工厂1
     */
    class ConcreteFactory1 implements AbstractFactory{
    
        public function createProductA() {
            return new ProductA1();
        }
    
        public function createProductB() {
            return new ProductB1();
        }
    }
    
    
    /**
     * 具体工厂2
     */
    class ConcreteFactory2 implements AbstractFactory{
    
        public function createProductA() {
            return new ProductA2();
        }
    
        public function createProductB() {
            return new ProductB2();
        }
    }
    
    
    /**
     * 客户端
     */
    class Client {
    
        /**
         * Main program.
         */
        public static function index() {
            self::run(new ConcreteFactory1());
            self::run(new ConcreteFactory2());
        }
    
        /**
         * 调用工厂实例生成产品,输出产品名
         * @param $factory AbstractFactory 工厂实例
         */
        public static function run(AbstractFactory $factory) {
            $productA = $factory->createProductA();
            $productB = $factory->createProductB();
            echo $productA->getName(), '<br />';
            echo $productB->getName(), '<br />';
        }
    
    }
    
    // 客户端执行
    Client::index();
    
    ?>
  • 相关阅读:
    git push 出现 you are not allowed to upload merges 错误提示
    构建React-app应用时create-react-app卡住超慢的解决办法<转>
    防抖与节流函数<转>
    this全面解析<转>
    正确的安装和使用nvm(mac)<转>
    TypeScript如何添加自定义d.ts文件(转)
    为什么angular library的build不能将assets静态资源打包进去(转)
    Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
    linux命令新建文件
    mac系统终端sudo免输入密码技能get
  • 原文地址:https://www.cnblogs.com/fangdada/p/14851943.html
Copyright © 2011-2022 走看看