【设计模式】AC-工厂模式(Factory Pattern)

前言

工厂模式可以通过一个工厂类生产出所需要的对象,这样的好处是

  1. 在你需要修改需要实例化的类的时候不需要修改外部实例化的代码

  2. 在需要通过判断来实例化类的时候不需要写大量的if-else或者switch

应用场景

  1. 大部分同样功能实例化可能会切换的类的时候都可以用到,如:已编写一个自己的Log类,外部已经多处引用,此时迭代了一个更好的Log类但是不想改变外部代码,可直接在工厂类中生产新的Log类。

  2. 可能通过配置切换不同对象来进行后续操作,如:平台支持A,B,C三种短信平台,可根据用户配置从工厂中产出对应的对象,不需要在外部多重判断,在接入更多平台的时候也不用修改多处代码。

实现方法

  1. 创建一个工厂类

  2. 暴露一个生产方法,根据参数产出对应的类

demo

一个标准接口,用于获取颜色的rgb值

interface ColorInterface
{
    public function getRgb(): array;
}

分别创建red,blue,green三种颜色获取rgb值的类

class RedClass implements ColorInterface
{
    public function getRgb(): array
    {
        return [0, 255, 0];
    }
}
class GreedClass implements ColorInterface
{
    public function getRgb(): array
    {
        return [0, 255, 0];
    }
}
class BlueClass implements ColorInterface
{
    public function getRgb(): array
    {
        return [0, 0, 255];
    }
}

创建一个工厂类,暴露生产接口用户生产取色器

class ColorFactory
{
    public function getColor($color): ColorInterface
    {
        switch (strtolower($color)) {
            case 'red':
                return new RedClass();
            case 'blue':
                return new BlueClass();
            case 'green':
                return new GreedClass();
            default :
                throw new Exception('Unknown color');
        }
    }
}

运行demo:

$factory = new ColorFactory();

echo "red:" . PHP_EOL;
var_dump($factory->getColor('red')->getRgb());

echo "green:" . PHP_EOL;
var_dump($factory->getColor('green')->getRgb());

echo "blue:" . PHP_EOL;
var_dump($factory->getColor('blue')->getRgb());

结果:

λ PHP demo.php
red:
array(3) {
  [0]=>
  int(0)
  [1]=>
  int(255)
  [2]=>
  int(0)
}
green:
array(3) {
  [0]=>
  int(0)
  [1]=>
  int(255)
  [2]=>
  int(0)
}
blue:
array(3) {
  [0]=>
  int(0)
  [1]=>
  int(0)
  [2]=>
  int(255)
}

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论