PHP面向对象-工厂、抽象工厂模式
工厂模式,是用工厂方法代替new操作的一种模式。其实也可以将其理解成为一个创建对象的工具类。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
- 优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
- 主要解决:
主要解决接口选择的问题。
- 何时使用:
我们明确地计划不同条件下创建不同实例时。
- 应用场景:
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
- 实现:
#接口类IApi.php
interface IApi{
public function draw();
}
#业务类 classA.php
class classA implements IApi{
public function draw(){
echo 'classA';
}
}
#业务类 classB.php
class classB implements IApi{
public function draw(){
echo 'classB';
}
}
#API调用 index.php
class Factory_Demo{
public function index($type=0)
{
if($type == 1 ){
$obj = new App\factory\classA();
}else{
$obj = new App\factory\classB();
}
$obj->draw();
}
}
$obj = new Factory_Demo();
$obj ->index(2);
实现效果
2.抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
- 优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
- 缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
- 主要解决:
主要解决接口选择的问题。
- 何时使用:
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
- 应用场景
- QQ 换皮肤,一整套一起换。
- 生成不同操作系统的程序。
- 商城的产品类别
- 实现