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();
    
    ?>
  • 相关阅读:
    合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数
    行转列和列转行
    递归删除指定目录下所有文件及子目录
    有两个字符串数组a和b,寻找相同元素 (a和b都比较大)
    在Sql Server 数据库中找到含某个词的所有字段
    一段JavaScript程序
    事实表计数比事实表数据量大
    Reporting Service报表设计常见技巧及问题解法
    使用WebService的方式调用部署在服务器的Wcf服务
    LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4) ?
  • 原文地址:https://www.cnblogs.com/fangdada/p/14851943.html
Copyright © 2011-2022 走看看