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

摘要:
Php//汽车接口AutoProduct{publicfunctiondir();}//奥迪A4classAudiA4ProductimplementsAutoProduct{//获取汽车名称publicfunctiondir(){echo“打开奥迪A4”。“”;}}//梅赛德斯-奔驰C200ClassBenzC200产品实现汽车产品{//获取汽车名称publicfunctiondirve(){echo“驾驶梅赛德斯-奔驰C20 0”。“”;}}?Php//工厂接口接口工厂{publicfunctiongetAuto();publicfunctiongetAirCondition();}//工厂A=奥迪A4+海尔某型号空调A工厂设备工厂{//汽车公共功能getAuto(){returnnewAudiA4Product();}//空调公共功能获取空调(){returnnewHaier空调();}}?Php//工厂B=梅赛德斯-奔驰C200+格力空调特定型号类别B工厂机具工厂{//汽车公共功能getAuto(){returnnewBenzC200产品();}//空调公共功能get空调(){returnnewGreeAirCondition();}}?抽象工厂类可以派生多个具体工厂类。

一、什么是抽象工厂模式

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

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品。 
  2. 同属于同一个产品族的产品可以使用。 

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

二、类图

PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)第1张

三、抽象工厂模式的组成

  1. 抽象工厂(AbstractFactory):确定工厂的业务范围。
  2. 具体工厂(ConcreteFactory):每个具体工厂对应一个产品族。具体工厂决定生产哪个具体产品对象。
  3. 抽象产品(AbstractProduct):同一产品等级结构的抽象类。
  4. 具体产品(ConcreteProduct):可供生产的具体产品。

 

 产品类:

<?php

// 汽车(抽象产品接口)
interface AutoProduct
{
    public function dirve();
}


//奥迪A4(具体产品类)
class AudiA4Product implements AutoProduct
{
    //获取汽车名称
    public function dirve()
    {
        echo "开奥迪A4"."<br>";
    }
}

//奔驰C200(具体产品类)
class BenzC200Product implements AutoProduct
{
    //获取汽车名称
    public function dirve()
    {
        echo "开奔驰C200"."<br>";
    }
}

?>
<?php

//空调(抽象产品接口)
interface AirCondition
{
    public function blow();
}

//格力空调某型号(具体产品类)
class GreeAirCondition implements AirCondition
{
    public function blow()
    {
        echo "吹格力空调某型号"."<br>";
    }
}

//海尔空调某型号(具体产品类)
class HaierAirCondition implements AirCondition
{
    public function blow()
    {
        echo "吹海尔空调某型号"."<br>";
    }
}

?>

工厂类:

<?php

//工厂接口
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();
    }
}

?>
<?php

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

    //空调
    public function getAirCondition()
    {
        return new GreeAirCondition();
    }
}

?>

客户端测试:

<?php

//客户端测试代码
$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(); //热的时候可以吹吹空调

?>

工厂方法模式:

  • 一个抽象产品类,可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类可以创建多个具体产品类的实例。

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

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

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

如果有什么疑问或者讲错的地方,欢迎大家留言。

 

免责声明:文章转载自《PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Citrix 服务器虚拟化之三十二 XenConvertJava ScheduledThreadPoolExecutor延迟或周期性执行任务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

抽象工厂模式(C++)

#define win 0 #define mac 1 #include <iostream> using namespace std; class button { public: button(){} virtual ~button(){} virtual void showbutton()=0; }; clas...

Java 设计模式六原则及23中常用设计模式

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访...

炒冷饭系列:设计模式 抽象工厂模式

摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模式 二、模式中包含的角色及其职责 三、抽象工厂模式实现 一、什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端 提供一个接口...

OC编程之道-创建对象之抽象工厂方法

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。                  <AbstractProductA>        <AbstractProductB> <AbstractFactory>       createProuductA               createP...

OOTV杯设计模式大赛——模式总结

摘抄自《大话设计模式》一书 报名参赛: “来、来、来,快来报名了,设计模式大赛,每个人都有机会,每个人都能成功,今天你参加比赛给自己一个机会,明天你就成功还社会一个辉煌。来来......”台子上方一很长的横幅,上写着“OOTV杯设计模式大赛海选”,下面一个帅小伙拿着话筒卖力的吆喝着。 “大姐、二姐,我们也去参加报名参加吧。”工厂三姐妹中最小的简单工厂说道,...

C#设计模式总结(转)

一、引言   经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来帮助大家收藏。   PS: 其实,很早之前我就看过所有的设计模式了,但是...