3 创建型模式-----抽象工厂模式

附加概念:

产品等级结构:不同品牌的同一类产品,如Haier电视机,TCL电视机都是电视机,因此属于同一个产品等级结构。

产品族:属于同一个品牌的所有产品,如Haier电视机,Haier冰箱等。

 

模式动机:工厂方法模式一般针对的是一个产品等级结构(如仅生产电视机),而抽象工厂模式针对的是多个产品等级结构(如不仅生产电视机,还生产空调)。

模式定义:一个具体工厂可以创建一个产品族的所有产品,又称为Kit模式

模式结构图:

模式实例:

一个电器工厂负责生产电视机和空调,其中包括Haier系列和TCL系列,使用抽象模式设计如下:

1>  定义一个抽象工厂类EFactory,其中提供生产电视机和空调的接口;

2>  分别定义工厂子类HaierFactory和TCLFactory实现具体的生产电视机和空调的方法;

3>  定义一个电视机接口Television;

4>  定义具体品牌的电视机类HaierTelevision和TCLTelevision分别实现电视机接口Television;

5>  定义一个空调接口AirConditioner;

6>  定义具体品牌的空调类HaierConditioner和TCLConditioner分别实现电视机接口Conditioner;

其模式结构图如下:

模式代码:

bt_抽象工厂模式.h

  1 #ifndef AFP_H
  2 #define AFP_H
  3
  4 #include <iostream>
  5
  6 /* **************************产品接口********************************** */
  7 class Television                                    // 定义电视机产品接口
  8 {
  9 public:
 10     virtual ~Television();
 11     virtual void play() = 0;
 12 };
 13 Television::~Television(){ }
 14
 15 class AirConditioner                                // 定义空调产品接口
 16 {
 17 public:
 18     virtual ~AirConditioner();
 19     virtual void changeTemperature() = 0;
 20 };
 21 AirConditioner::~AirConditioner(){ }
 22
 23 /* **************************Haier产品类********************************** */
 24 class HaierTelevision : public Television           // 具体的Haier电视机类
 25 {
 26 public:
 27     virtual void play();
 28 };
 29 void HaierTelevision::play(){ }
 30
 31 class HaierAirConditioner : public AirConditioner  // 具体的Haier空调类
 32 {
 33 public:
 34     virtual void changeTemperature();
 35 };
 36 void HaierAirConditioner::changeTemperature(){ }
 37
 38 /* **************************TCL产品类********************************** */
 39 class TCLTelevision : public Television           // 具体的TCL电视机类
 40 {
 41 public:
 42     virtual void play();
 43 };
 44 void TCLTelevision::play(){ }
 45
 46 class TCLAirConditioner : public AirConditioner   // 具体的TCL空调类
 47 {
 48 public:
 49     virtual void changeTemperature();
 50 };
 51 void TCLAirConditioner::changeTemperature(){ }
 52
 53
 54
 55 /* **************************工厂接口************************************** */
 56
 57 class EFactory                                             // 定义抽象工厂
 58 {
 59 public:
 60     virtual ~EFactory();
 61     virtual Television* produceTelevision() = 0;           // 生产电视机的接口
 62     virtual AirConditioner* produceAirConditioner() = 0;   // 生产空调的接口
 63 };
 64 EFactory::~EFactory(){ }
 65
 66 /* **************************Haier工厂类********************************** */
 67 class HaierFactory : public EFactory                 // 定义生产Haier产品系列的工厂
 68 {
 69 public:
 70     virtual Television* produceTelevision();              // 生产Haier电视机
 71     virtual AirConditioner* produceAirConditioner();      // 生产Haier空调
 72 };
 73 Television* HaierFactory::produceTelevision()
 74 {
 75     std::cout << "生产了一台Haier电视机" << std::endl;
 76     return new HaierTelevision;
 77 }
 78 AirConditioner* HaierFactory::produceAirConditioner()
 79 {
 80     std::cout << "生产了一台Haier空调" << std::endl;
 81     return new HaierAirConditioner;
 82 }
 83
 84 /* **************************TCL工厂类********************************** */
 85 class TCLFactory : public EFactory                  // 定义生产TCL产品系列的工厂
 86 {
 87 public:
 88     virtual Television* produceTelevision();              // 生产TCL电视机
 89     virtual AirConditioner* produceAirConditioner();      // 生产TCL空调
 90 };
 91 Television* TCLFactory::produceTelevision()
 92 {
 93     std::cout << "生产了一台TCL电视机" << std::endl;
 94     return new TCLTelevision;
 95 }
 96 AirConditioner* TCLFactory::produceAirConditioner()
 97 {
 98     std::cout << "生产了一台TCL空调" << std::endl;
 99     return new TCLAirConditioner;
100 }
101
102 #endif // AFP_H

bt_抽象工厂模式.cpp

 1 #include <iostream>
 2 #include "bt_抽象工厂模式.h"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     // 客户端生产电视机时只需和抽象工厂与抽象电视机交互即可
 9     EFactory* factory;
10     factory = new HaierFactory;             // Haier工厂
11     Television* tv;
12     AirConditioner* ac;
13     tv = factory->produceTelevision();      // 多态调用:生产Haier电视机
14     ac = factory->produceAirConditioner();  // 多态调用:生产Haier空调
15
16     factory = new TCLFactory;               // TCL工厂
17     tv = factory->produceTelevision();      // 多态调用:生产TCL电视机
18     ac = factory->produceAirConditioner();  // 多态调用:生产TCL空调
19
20     delete factory;
21     delete tv;
22     delete ac;
23
24     return 0;
25 }


模式优缺点:

添加新的产品族(即一个新的品牌)比较容易,此时只需要定义新的工厂和产品类即可;但增加产品等级(即原有品牌的种类)比较麻烦,此时必须修改抽象工厂以添加新种类的生产接口,同时所有已有的产品族工厂也要修改,这就违背了“开闭原则”。该模式具体应用中一般适合对象的多种状态同时发生变化时,比如操作系统中的主题管理程序等。

比较:

抽象工厂模式针对的是多个产品等级,而工厂方法模式针对的是一个产品等级,抽象工厂模式经过退化后完全可以变为工厂方法模式,甚至是简单工厂模式。

时间: 2024-10-17 12:50:35

3 创建型模式-----抽象工厂模式的相关文章

java语言实现创建型设计模式—抽象工厂模式

一.描述 抽象工厂模式是在工厂方法的模式上进一步抽象而来,如果说工厂方法模式是对一个产品结构的创建而言的话,那么抽象工厂模式则是针对多个产品结构而言的,它被用来一次创建多个不同的产品对象. 我们要创建一个摩托车轮胎和摩托车把手,又要创建一个自行车轮胎和自行车把手,如果我们使用工厂方法模式的话我们需要四个类:创建摩托车轮胎的工厂类,创建摩托车把手的工厂类,创建自行车轮胎的工厂类和创建自行车把手的工厂类,但是如果我们使用抽象工厂方法的话,我们需要创建两个工厂类:创建摩托车轮胎和把手的工厂类,创建自行

Java设计模式(创建型:工厂方法模式+抽象工厂模式)

设计模式根据目的准则可以分为三类: 创建型:creational 创建型的设计模式与对象的创建有关. 结构型:Structural 处理类和对象之间的组合. 行为型:behavioral 描述类和对象如何交互及如何分配职责. 工厂方法模式 站在使用者的角度,工厂方法模式是指使用者提出想要实现的具体功能或者说是想要生产的具体的东西的要求,在通过工厂制造之后就将该东西或功能交付给使用者.使用者并不知道实现的具体过程,只是做了要求提出以及实现的结果的使用. 严谨来说工厂方法模式(Factory Met

4、设计模式-创建型模式-抽象工厂模式

抽象工厂模式 产品等级结构和产品族 工厂方法模式中具体工厂负责生产具体的产品 每一个具体工厂对应一种具体的产品 工厂方法具有唯一性 一般情况下:一个具体工厂中只有一个或一组重载的工厂方法 有时候希望一个一个工厂可以提供多个产品对象 而不是单一的产品对象 产品等级结构: 产品等级结构即产品的继承结构,如一个抽象类是电视机 子类有海尔电视机.海信电视机等 抽象电视机与具体与具体品牌的电视机之间构成了一个产品等级结构 抽象电视机是父类,具体品牌的电视机是其子类 产品族: 在抽象工厂模式中 产品族是指由

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

.Net简单工厂模式,工厂模式,抽象工厂模式实例

1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类. 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.实例 用工人种蔬菜的例子来说明,蔬菜植物的产品器官有根.茎.叶.花.果等5类,因此按产品器官分类也分成5种,分别是根菜类,茎菜类,叶莱类,花菜类以及果菜类.我们以根菜类,茎菜类为例,

23中设计模式----------抽象工厂模式

抽象工厂模式: 在上一篇中讲到通过各个具体球类(如:足球,篮球等)来继承总球类(Ball),来实现通过BallFactory对具体球类的生产. 不过,当时只是能造出不同球类,而在每种球类中肯定也有颜色,大小等不同的属性.所以,为了实现在工厂中添加属性.将抽象的Ball球类,修改成Bll接口,在该接口中添加所需要的方法: 这种模式是抽象工厂模式,抽象工厂模式是抽象方法模式的升级.在有多个业务品种,业务分级时,采用抽象工厂模式生产需要的对象是一种非常好的解决房还是.(比如,在生产球类的时候,不仅要分

创建型模式--抽象工厂模式

概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.  适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系列中的一个来配置时. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时.  参与者 1.AbstractFactory 声明一个创建抽象产品对象的操作接口. 2.ConcreteFactory 实现创建具体产品对象的操作. 3.AbstractProduct 为一

第5章 创建型模式—抽象工厂模式

1. 抽象工厂的定义 (1)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 ①只需各要知道创建一系列对象的接口,而无需知道具体使用的是哪一个实现 ②这一系列对象是相关或相互依赖的,也就是说既要创建对象,还要约束它们之间的关系. ③一系列对象是构建新对象所需要的组成部分,并且对象之间相互有约赖.如电脑由CPU和主板等组成,但CPU的针脚数和主板提供的插口必须是匹配的,否则无法组装. (2)产品族和产品等级 ①产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等