php设计模式之一工厂模式--抽象工厂模式

最近在学习设计模式,很多地方还理解的不够。在这里记录一下自己学习的东西,方便自己以后查看和理解,同时也给正在学这部分的同学提供一点参考。

工厂模式的几种形态:

  1、简单工厂模式(Simple Factory) |又叫做  静态工厂方法模式(Static Factory Method)
  2、工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory)
  3、抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit)

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

抽象工厂模式包含如下角色:

  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂
  • AbstractProduct:抽象产品
  • Product:具体产品
<?php
/**
 * 抽象工厂模式
 */
//AbstractFactory:抽象工厂
abstract class AbstractProductA
{
    abstract public function use();
}

//ConcreteFactory:具体工厂
class ProductA1 extends AbstractProductA
{
    public function use(){
        var_dump('productA1');
    }
}
class ProductA2 extends AbstractProductA
{
    public function use(){
        var_dump('productA2');
    }
}

//AbstractProduct:抽象产品
abstract class AbstractProductB
{
    abstract public function eat();
}

//Product:具体产品
class ProductB1 extends AbstractProductB
{
    public function eat()
    {
        var_dump('productB1');
    }
}
class ProductB2 extends AbstractProductB
{
    public function eat()
    {
        var_dump('productB2');
    }
}

abstract class AbstractFactory
{
    abstract public function createProductA();
    abstract public function createProductB();
}

class ConcreteFactory1 extends AbstractFactory
{
    public function createProductA()
    {
        return new ProductA1();
    }
    public function createProductB()
    {
        return new ProductB1();
    }
}
class ConcreteFactory2 extends AbstractFactory
{
    public function createProductA()
    {
        return new ProductA2();
    }
    public function createProductB()
    {
        return new ProductB2();
    }
}

$a=new ConcreteFactory1();
$b=$a->createProductA();
$b->use();

$c=new ConcreteFactory2();
$d=$c->createProductB();
$d->eat();

三种工厂模式总结:

1.三种在形式和特点上极为相似,最终目的都是解耦。将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。
2.对比

  工厂方法模式:用于创建复杂对象。(单点食物)
  抽象工厂模式:用于创建一组相关或相互依赖的复杂对象。(买套餐)
  工厂方法创建一般只有一个方法,创建一种产品。抽象工厂一般有多个方法,创建一系列产品。

我们不必去在意模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了,而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

 

posted @ 2017-10-19 15:29  CandyChen  阅读(106)  评论(0)    收藏  举报