工厂模式

244 阅读2分钟

什么是工厂模式

就是负责生产其它对象的类或方法,工厂类一般调用自身静态方法生产对象实例,它必须返回一个对象。

为什么要用工厂模式

  • 我们通过一个类创建一个对象。当快完成的时候,我们要扩展其功能,发现原来的类名不合适或者构造函数要多加个参数才能实现其功能,现在我们都通过这个类创建一大堆实例了,难道我们还要一个个的改吗?这个时候我们才能感受到“高内聚低耦合”的博大精深。用工厂模式就可以解决问题。
  • 再考虑一个场景,我们做一个功能给用户发IM消息或者短信或者邮件。我就是想用一个对象来搞定这些,具体用哪个,视你自己业务而定,用工厂模式可以减少耦合度。

工厂模式的优缺点

  • 优点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合度,提高系统的可维护性与可扩展性

  • 缺点:当要修改类的时候,工厂类也需要做出相对应的更改,违反了开闭原则(对于扩展代码开放,对于类内修改关闭)

工厂模式的实现

  • 类一般命名带有Factory关键字
  • 方法最好带有Factory关键字,必须返回一个对象
  • 所有的实体类具有相同的功能,一般用接口抽象出来

具体实现类

//接口
interface iShape {
    public function draw();
}
class Circle implements iShape {
    public function draw() {
        return "画一个圆形";
    }
}

class Square implements iShape {
    public function draw() {
        return "画一个正方形";
    }
}

class Rectangle implements iShape {
    public function draw() {
        return "画一个长方形";
    }
}

工厂类

class MyFactory {

    const CIRCLE    = 'circle';
    const SQUARE    = 'square';
    const RECTANGLE = 'rectangle';

    private $shape;

    public function __construct($shape) {
        $this->shape = $shape;
    }

    public function factory() {
        switch ($this->shape) {
            case self::CIRCLE:
                return new Circle();
                break;
            case self::SQUARE:
                return new Square();
                break;
            case self::RECTANGLE:
                return new Rectangle();
                break;
            default:
                return null;
        }
    }
}
$shape  = (new MyFactory(MyFactory::CIRCLE))->factory();
$string = $shape->draw();
echo $string;

end

个人公众号:技术源区

欢迎扫描下图关注公众号:技术源区,分享一些有深度的文章!