zoukankan      html  css  js  c++  java
  • 「PHP」简单工厂模式

    引言
     
      所属:创建型模式,常用设计模式之一
      工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
      下面为简单工厂模式。
       参考资料:
      • 《大话设计模式》程杰
     
    模式概述
     
      简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例
      
      其中有两个关键字,工厂类、产品类
     
      下面举个例子解释这两个关键词。
     
    举个栗子
     
        程序代码中应用缓存,暂时考虑用Memcached,之后可能会换Redis,程序如何设计。
      
        解决的问题:
          
          假设程序设计使用Memcached,每一次的代码肯定是 new Memcaced ; 如果因为项目扩展要更换为Redis,必然很多代码都要改。
     
        流程图如下:
          
              

        
        产品类:其中Memcached和Redis是产品类,暂时举例两个产品类,可能会有很多个。

        工厂类:声明一个公共类,由该类指定使用哪个产品,这样就不需要改动【调用层】代码内容。

        看到这个图是不是对关键词清晰很多了。

        我们要做什么:

          让工厂类【公共类】来选择调用哪个具体产品

        
    程序设计代码:
     
    入口文件:index.php
    <?php
    // 自动加载
    spl_autoload_register(function ($class) {
        $file = __DIR__ . '/' . $class . '.php';
        require_once($file);
    });
    
    
    $mode = Cache::cacheMode('Redis'); // 调用工厂类(缓存公共类)
    $mode->getName();

    公共缓存文件 Cache.php

    <?php
    namespace factory;
    
    /**
     * 缓存公共方法
     **/
    class Cache
    {
        public static function cacheMode($type)
        {
            switch ($type) {
                case 'Redis':
                    return new RedisMode();
                    break;
                case 'Memca';
                    return new MemcachedMode();
                    break;
                default:
                    return false;
                    break;
            }
        }
    }

    Redis类:RedisMode.php

    <?php
    
    class RedisMode
    {
        public function getName()
        {
            echo '我是Redis';
        }
    }

     Memcached类:MemcachedMode.php

    <?php
    
    class MemcachedMode
    {
        public function getName()
        {
            echo '我是Memcached';
        }
    }
     
    以下为源码地址

      

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

    总结

      

      优点:

        1. 一个调用者想创建一个对象,只要知道其名称就可以了。

        2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

        3、屏蔽产品的具体实现,调用者只关心产品的接口。

      缺点:

        1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

        2. 违背了设计模式的原则【开放封闭】原则

          开放封闭:一个类,应该是可扩展的,而不可修改的。

      之后,工厂方法模式应运而生,请看下章。

     

  • 相关阅读:
    [办公自动化]Excel表格求和始终显示#VALUE!
    Excel中如何对IP地址排序(linux 中呢?用sort)
    勇士通关——记多年前的面试
    [听听音乐]路,李知蹊
    [办公自动化]PPT演示时加个动画倒计时
    [网络安全]burp 转换ascii编码
    [学习笔记]掌控安全的课程学习笔记:20191228
    [生活随笔]起死回生的九阳破壁机
    [IT新应用]如何拯救死机的苹果手机(iPhone X)
    八月份课堂--Python爬虫(Spider)基础
  • 原文地址:https://www.cnblogs.com/houdabao/p/9517820.html
Copyright © 2011-2022 走看看