「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. 违背了设计模式的原则【开放封闭】原则

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

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

 

posted @ 2018-08-22 15:12  侯大宝  阅读(312)  评论(0编辑  收藏  举报