资讯专栏INFORMATION COLUMN

PHP设计模式(三)抽象工厂模式(Abstract Factory)

W_BinaryTree / 1593人阅读

摘要:支持增加任意产品抽象工厂用来生产不同产品族的全部产品。对于增加新的产品,无能为力支持增加产品族参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式

一、什么是抽象工厂模式

抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件:

系统中有多个产品族,而系统一次只可能消费其中一族产品。

同属于同一个产品族的产品可以使用。

产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族。

二、类图

三、案例
产品类
// 汽车(抽象产品接口)
interface AutoProduct
{
    public function dirve();
}


//奥迪A4(具体产品类)
class AudiA4Product implements AutoProduct
{
    //获取汽车名称
    public function dirve()
    {
        echo "开奥迪A4"."
"; } } //奔驰C200(具体产品类) class BenzC200Product implements AutoProduct { //获取汽车名称 public function dirve() { echo "开奔驰C200"."
"; } }
//空调(抽象产品接口)
interface AirCondition
{
    public function blow();
}

//格力空调某型号(具体产品类)
class GreeAirCondition implements AirCondition
{
    public function blow()
    {
        echo "吹格力空调某型号"."
"; } } //海尔空调某型号(具体产品类) class HaierAirCondition implements AirCondition { public function blow() { echo "吹海尔空调某型号"."
"; } }
工厂类
//工厂接口
interface Factory
{
    public function getAuto();
    public function getAirCondition();
}


//工厂A = 奥迪A4 + 海尔空调某型号
class AFactory implements Factory
{
    //汽车
    public function getAuto()
    {
        return new AudiA4Product();
    }

    //空调
    public function getAirCondition()
    {
        return new HaierAirCondition();
    }
}
//工厂B = 奔驰C200 + 格力空调某型号
class BFactory implements Factory
{
    //汽车
    public function getAuto()
    {
        return new BenzC200Product();
    }

    //空调
    public function getAirCondition()
    {
        return new GreeAirCondition();
    }
}
客户端类
//客户端测试代码
$factoryA = new AFactory();
$factoryB = new BFactory();

//A工厂制作车
$auto_carA = $factoryA->getAuto();
$auto_airA = $factoryA->getAirCondition();

//B工厂制作车
$auto_carB = $factoryB->getAuto();
$auto_airB = $factoryB->getAirCondition();

//开奥迪车+吹海尔空调
$auto_carA->dirve();
$auto_airA->blow(); //热的时候可以吹吹空调

//开奔驰车+吹格力空调;
$auto_carB->dirve();
$auto_airB->blow(); //热的时候可以吹吹空调
四、抽象工厂模式的组成

抽象工厂(AbstractFactory):确定工厂的业务范围。

具体工厂(ConcreteFactory):每个具体工厂对应一个产品族。具体工厂决定生产哪个具体产品对象。

抽象产品(AbstractProduct):同一产品等级结构的抽象类。

具体产品(ConcreteProduct):可供生产的具体产品。

工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

三种工厂的比较

简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

参考 系列源地址

WilburXu/design_pattern

系列目录

PHP 设计模式概述

PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

PHP设计模式(二)工厂方法模式(Factory Method)

PHP设计模式(三)抽象工厂模式(Abstract Factory)

PHP设计模式(四)单例模式(Singleton)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29506.html

相关文章

  • PHP设计模式(二)工厂方法模式Factory Method)

    摘要:对于这个问题,接下来的工厂方法模式可以解决这个问题。二工厂方法模式的优点拥有良好的封装性,代码结构清晰。参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 简单工厂简述: 简单工厂模式实现了产品类的代码跟客户端代码分离,但会有一个问题,优秀的代码是符合开闭原则如果你要加一个C类产品,你就要修改工厂类里面的代码,也就是说...

    zhjx922 评论0 收藏0
  • PHP设计模式(一)简单工厂模式 (Simple Factory For PHP

    摘要:工厂模式使一个类的实例化延迟到其子类。参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 一、什么是简单工厂模式 简单工厂 (Simple Factory)又称静态工厂方法模式(Static Factory Method Pattern)   使用的频率可以说是非常之高,它的官方解释为:定义一个用于创建对象的接口,让子...

    Hancock_Xu 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    摘要:反射提供给面向对象编程可以自省的能力,即反射。在简单工厂模式中,根据传递的参数来返回不同的类的实例简单工厂模式又称为静态工厂方法模式。也就是简单工厂模式工厂工厂类。PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解]利用反射来实现工厂模式的生产而无需创建特定的工厂类本文地址http://janrs.com/?p=833转载无需经过作者本人授权转载...

    番茄西红柿 评论0 收藏2637
  • PHP中的设计模式 <持续更新中...>

    摘要:工厂模式工厂模式代码片段访问静态属性要加符静态方法生成实例对象,作为函数的参数工厂就是负责生成对象的类或方法工厂模式,是把创造者类和要生产的类分开,创建者是个工厂类,定义了用于生产产品对象的方法行程特殊的代码重复,不必要的子类话,为了工 工厂模式 /* 工厂模式代码片段*/ class Employee{ private static $type = array(minio...

    mgckid 评论0 收藏0

发表评论

0条评论

W_BinaryTree

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<