创造型设计模式-----抽象工厂模式

一种商品需要用多个产品组成就需要运用抽象工厂模式。

概念:

抽象工厂:声明一个用于完成抽象商品对象创建操作的接口

具体工厂:实现创建具体产品对象的操作

抽象产品:声明一个用于一类产品对象的接口

具体产品:定义有相应的具体工厂来创建的产品对象

客户端:使用抽象工厂和抽象产品类声明的唯一接口

如下图所示:抽象工厂UML图

举个例子:车与零件

车有许许多多的零件part组成:以wheels(轮胎),mirrors(车镜),engine(引擎),body(车身)组成,不同的车需要不同的零件配置

代码如下:abstract.h

  1 #ifndef ABS_H_
  2 #define ABS_H_
  3 #include <iostream>
  4 #include <string>
  5 using namespace std;
  6 class Wheels {
  7 public:
  8     Wheels();
  9     ~Wheels();
 10     virtual string getWheels() = 0;
 11 };
 12 
 13 class BenQWheels :public Wheels {
 14 public:
 15     BenQWheels();
 16     ~BenQWheels();
 17     string getWheels();
 18 };
 19 
 20 class BMWWheels :public Wheels {
 21 public:
 22     BMWWheels();
 23     ~BMWWheels();
 24     string getWheels();
 25 };
 26 
 27 class GeneralWheels :public Wheels {
 28 public:
 29     GeneralWheels();
 30     ~GeneralWheels();
 31     string getWheels();
 32 };
 33 
 34 class Mirrors {
 35 public:
 36     Mirrors();
 37     ~Mirrors();
 38     virtual string getMirrors() = 0;
 39 };
 40 
 41 class BMWMirrors :public Mirrors {
 42 public:
 43     BMWMirrors();
 44     ~BMWMirrors();
 45     string getMirrors();
 46 };
 47 
 48 class BenQMirrors :public Mirrors {
 49 public:
 50     BenQMirrors();
 51     ~BenQMirrors();
 52     string getMirrors();
 53 };
 54 
 55 class GeneralMirrors :public Mirrors {
 56 public:
 57     GeneralMirrors();
 58     ~GeneralMirrors();
 59     string getMirrors();
 60 
 61 };
 62 
 63 class Engine {
 64 public:
 65     Engine();
 66     ~Engine();
 67     virtual string getEngine() = 0;
 68 };
 69 
 70 class BMWEngine :public Engine {
 71 public:
 72     BMWEngine();
 73     ~BMWEngine();
 74     string getEngine();
 75 };
 76 
 77 class BenQEngine :public Engine {
 78 public:
 79     BenQEngine();
 80     ~BenQEngine();
 81     string getEngine();
 82 };
 83 
 84 class GeneralEngine :public Engine {
 85 public:
 86     GeneralEngine();
 87     ~GeneralEngine();
 88     string getEngine();
 89 };
 90 
 91 class Body
 92 {
 93 public:
 94     Body();
 95     ~Body();
 96     virtual string  getBody() = 0;
 97 
 98 };
 99 
100 class BenQBody :public Body {
101 public:
102     BenQBody();
103     ~BenQBody();
104     string getBody();
105 };
106 
107 class BMWBody :public Body {
108 public:
109     BMWBody();
110     ~BMWBody();
111     string getBody();
112 };
113 
114 class GeneralBody :public Body {
115 public:
116     GeneralBody();
117     ~GeneralBody();
118     string getBody();
119 };
120 
121 #endif
  1 #include "AbstactProduct.h"
  2 #include <string>
  3 using namespace std;
  4 
  5 Wheels::Wheels() {
  6 
  7 }
  8 Wheels::~Wheels() {
  9 
 10 }
 11 
 12 BMWWheels::BMWWheels() {
 13 
 14 }
 15 BMWWheels::~BMWWheels() {
 16 
 17 }
 18 
 19 string BMWWheels::getWheels() {
 20     return "BMW wheels";
 21 }
 22 
 23 
 24 BenQWheels::BenQWheels() {
 25 
 26 }
 27 BenQWheels::~BenQWheels() {
 28 
 29 }
 30 string BenQWheels::getWheels() {
 31     return "BenQ wheels";
 32 }
 33 
 34 GeneralWheels::GeneralWheels() {
 35 
 36 }
 37 GeneralWheels::~GeneralWheels() {
 38 
 39 }
 40 string GeneralWheels::getWheels() {
 41     return "General Wheels";
 42 }
 43 
 44 
 45 Mirrors::Mirrors() {
 46 
 47 }
 48 Mirrors::~Mirrors() {
 49 
 50 }
 51 
 52 BenQMirrors::BenQMirrors() {
 53 
 54 }
 55 BenQMirrors::~BenQMirrors() {
 56 
 57 }
 58 string BenQMirrors::getMirrors() {
 59     return "BenQ mirrors";
 60 }
 61 
 62 BMWMirrors::BMWMirrors() {
 63 
 64 }
 65 BMWMirrors::~BMWMirrors() {
 66 
 67 }
 68 string BMWMirrors::getMirrors() {
 69     return "BMW mirrors";
 70 }
 71 GeneralMirrors::GeneralMirrors() {
 72 
 73 }
 74 GeneralMirrors::~GeneralMirrors() {
 75 
 76 }
 77 string GeneralMirrors::getMirrors() {
 78     return "General Mirrors";
 79 }
 80 
 81 Engine::Engine() {
 82 
 83 }
 84 
 85 Engine::~Engine() {
 86 
 87 }
 88 
 89 BMWEngine::BMWEngine() {
 90 
 91 }
 92 
 93 BMWEngine::~BMWEngine() {
 94 
 95 }
 96 string BMWEngine::getEngine() {
 97     return "BMW engine";
 98 }
 99 
100 BenQEngine::BenQEngine() {
101 
102 }
103 
104 BenQEngine::~BenQEngine() {
105 
106 }
107 
108 string BenQEngine::getEngine() {
109     return "BenQ engine";
110 }
111 
112 GeneralEngine::GeneralEngine() {
113 
114 }
115 GeneralEngine::~GeneralEngine() {
116 
117 }
118 
119 string GeneralEngine::getEngine() {
120     return "General engine";
121 }
122 
123 Body::Body() {
124 
125 }
126 Body::~Body() {
127 
128 }
129 
130 BMWBody::BMWBody() {
131 
132 }
133 BMWBody::~BMWBody() {
134 
135 }
136 
137 string BMWBody::getBody() {
138     return "BMW body";
139 }
140 
141 BenQBody::BenQBody() {
142 
143 }
144 BenQBody::~BenQBody() {
145 
146 }
147 
148 string BenQBody::getBody() {
149     return "BenQ body!";
150 }
151 
152 GeneralBody::GeneralBody() {
153 
154 }
155 
156 GeneralBody::~GeneralBody() {
157 
158 }
159 
160 string GeneralBody::getBody() {
161     return "General body";
162 }

Carfactoy.h

#ifndef CAR_FACTORY_H_
#define CAR_FACTORY_H_
#include "AbstactProduct.h"
class Car {
public:
    Car();
    ~Car();
    virtual Wheels* getWheel() = 0;
    virtual Mirrors* getMirror() = 0;
    virtual Engine* getEngine() = 0;
    virtual Body* getBody() = 0;
};

class BMWCar :public Car {
public:
    BMWCar();
    ~BMWCar();
    Wheels* getWheel();
    Mirrors* getMirror();
    Engine* getEngine();
    Body* getBody();
};

class BenQCar :public Car {
public:
    BenQCar();
    ~BenQCar();
    Wheels* getWheel();
    Mirrors* getMirror();
    Engine* getEngine();
    Body* getBody();
};
class GeneralCar :public Car {
public:
    GeneralCar();
    ~GeneralCar();
    Wheels* getWheel();
    Mirrors* getMirror();
    Engine* getEngine();
    Body* getBody();
};
#endif // CAR_FACTORY_H_

carfactory.cpp

 1 #include "AbstactProduct.h"
 2 #include"Carfactory.h"
 3 #include<iostream>
 4 
 5 using namespace std;
 6 
 7 Car::Car() {
 8 
 9 }
10 Car::~Car() {
11 
12 }
13 
14 BMWCar::BMWCar() {
15 
16 }
17 BMWCar::~BMWCar() {
18 
19 }
20 Wheels* BMWCar::getWheel() {
21     return (new BMWWheels());
22 }
23 Mirrors* BMWCar::getMirror() {
24     return (new BMWMirrors());
25 }
26 Engine* BMWCar::getEngine() {
27     return (new BMWEngine());
28 }
29 Body* BMWCar::getBody() {
30     return (new BMWBody());
31 }
32 
33 BenQCar::BenQCar() {
34 
35 }
36 BenQCar::~BenQCar() {
37 
38 }
39 Wheels* BenQCar::getWheel() {
40     return (new BenQWheels());
41 }
42 Mirrors* BenQCar::getMirror() {
43     return (new BenQMirrors());
44 }
45 Engine* BenQCar::getEngine() {
46     return (new BenQEngine());
47 }
48 Body* BenQCar::getBody() {
49     return (new BenQBody());
50 }
51 
52 GeneralCar::GeneralCar() {
53 
54 }
55 GeneralCar::~GeneralCar() {
56 
57 }
58 Wheels* GeneralCar::getWheel() {
59     return (new GeneralWheels());
60 }
61 Mirrors* GeneralCar::getMirror() {
62     return (new GeneralMirrors());
63 }
64 Engine* GeneralCar::getEngine() {
65     return (new GeneralEngine());
66 }
67 Body* GeneralCar::getBody() {
68     return (new GeneralBody());
69 }

client.cpp

 1 //#include "AbstactProduct.h"
 2 #include "Carfactory.h"
 3 #include<iostream>
 4 using namespace std;
 5 
 6 int main(int argc, char* argv[])
 7 {
 8     Car* car = new BMWCar();
 9     cout << car->getBody()->getBody() << endl;
10     cout << car->getEngine()->getEngine() << endl;
11     cout << car->getMirror()->getMirrors() << endl;
12     cout << car->getWheel()->getWheels() << endl;
13     system("pause");
14 }

输出

原文地址:https://www.cnblogs.com/lyf-sunicey/p/8108998.html