• 「PHP」抽象工厂模式


    引言
     
      所属:创建型模式,常用设计模式之一
      
      参考资料:
      • 《大话设计模式》程杰
     
    模式概述
      
      官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
      
      大意:创建一个约束接口,相关功能去按照接口规范实现这个接口达到统一;
      
    举个栗子
     
        模拟场景:两个甲方,分别为甲方A,甲方B,甲方A使用MySQL数据库,甲方B使用Oracle,由于两种数据库的SQL查询语句语法有部分不一致,这时要同时编写【用户类】,【订单类】,如果用抽象工厂实现?
     
        流程图如下:
          
              
        
    程序设计代码:
     
    1. 产品类接口
    <?php
    /**
     * 用户产品类具体操作接口
     */
    namespace abstract_factory;
    
    interface UserInterface
    {
        /**
         * 查询操作接口
         * @return mixed
         */
        public function select();
    
        /**
         * 插入操作接口
         * @return mixed
         */
        public function insert();
    }
    <?php
    /**
     * 订单产品类具体操作接口
     */
    namespace abstract_factory;
    
    interface OrderInterface
    {
        /**
         * 查询操作接口
         * @return mixed
         */
        public function select();
    
        /**
         * 插入操作接口
         * @return mixed
         */
        public function insert();
    }
    2. 具体产品操作类
    <?php
    /**
     * MySQL 订单产品类具体操作
     */
    namespace abstract_factory;
    
    class MysqlOrder
    {
        /**
         * 查询具体操作
         */
        public function select()
        {
            echo '订单表查询';
        }
    
        /**
         * 插入具体操作
         */
        public function insert()
        {
            echo '订单表插入';
        }
    }
    <?php
    /**
     * MySQL 用户产品类具体操作
     */
    namespace abstract_factory;
    
    class MysqlUser
    {
        /**
         * 查询操作
         */
        public function select()
        {
            echo '订单表查询';
        }
    
        /**
         * 插入操作
         */
        public function insert()
        {
            echo '订单表插入';
        }
    }
    <?php
    /**
     * Oracle 订单产品类具体操作
     */
    namespace abstract_factory;
    
    class OracleOrder
    {
        /**
         * 查询具体操作
         */
        public function select()
        {
            echo '订单表查询';
        }
    
        /**
         * 插入具体操作
         */
        public function insert()
        {
            echo '订单表插入';
        }
    }
    <?php
    /**e
     * Oracle 用户产品类具体操作
     */
    namespace abstract_factory;
    
    class OracleUser
    {
        /**
         * 查询操作
         */
        public function select()
        {
            echo '用户表查询';
        }
    
        /**
         * 插入操作
         */
        public function insert()
        {
            echo '用户表插入';
        }
    }
    3. 定义需要实例产品类的工厂类接口数量
    <?php
    /**
     * 定义需要实例产品类的工厂类接口数量
     */
    namespace abstract_factory;
    
    interface DBFactoryInterface
    {
        /**
         * 用户工厂类接口
         * @return mixed
         */
        public function createUser();
    
        /**
         * 订单工厂类接口
         * @return mixed
         */
        public function createOrder();
    }
    4. 包装产品类升级为工厂类 
    <?php
    /**
     * MySQL操作 包装产品类升级为工厂类
     */
    namespace abstract_factory;
    
    class MysqlFactory implements DBFactoryInterface
    {
        /**
         * 用户产品类
         * @return MysqlUser
         */
        public function createUser()
        {
            return new MysqlUser();
        }
    
        /**
         * 用户产品类
         * @return MysqlOrder
         */
        public function createOrder()
        {
            return new MysqlOrder();
        }
    
    }
    <?php
    /**
     * Oracle操作 包装产品类升级为工厂类
     */
    namespace abstract_factory;
    
    class OracleFactory implements DBFactoryInterface
    {
        /**
         * 用户产品类
         * @return OracleUser
         */
        public function createUser()
        {
            return new OracleUser();
        }
    
        /**
         * 订单产品类
         * @return OracleOrder
         */
        public function createOrder()
        {
            return new OracleOrder();
        }
    
    }
    以下为源码地址

      GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

  • 相关阅读:
    Leetcode 814. 二叉树剪枝
    Leetcode 104. 二叉树的最大深度
    Leetcode 617. 合并二叉树
    Leetcode 226. 翻转二叉树
    Leetcode 654.最大二叉树
    【Leetcode】413. Arithmetic Slices
    【Leetcode】128. Longest Consecutive Sequence
    【Leetcode】605. Can Place Flowers
    【Leetcode】647. Palindromic Substrings
    高可用架构
  • 原文地址:https://www.cnblogs.com/houdabao/p/9510302.html
Copyright © 2020-2023  润新知