什么是工厂模式
就是负责生产其它对象的类或方法,工厂类一般调用自身静态方法生产对象实例,它必须返回一个对象。
为什么要用工厂模式
- 我们通过一个类创建一个对象。当快完成的时候,我们要扩展其功能,发现原来的类名不合适或者构造函数要多加个参数才能实现其功能,现在我们都通过这个类创建一大堆实例了,难道我们还要一个个的改吗?这个时候我们才能感受到“高内聚低耦合”的博大精深。用工厂模式就可以解决问题。
- 再考虑一个场景,我们做一个功能给用户发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
个人公众号:技术源区
欢迎扫描下图关注公众号:技术源区,分享一些有深度的文章!
