与前面两个工厂不同的是,抽象工厂提供的产品不是同一个类型的东西,而是一系列配套的不同产品。例如一个网站可能会有Light theme和Dark theme,对应不同的皮肤skin,按钮button,搜索栏searchbar。如何在装配时防止出现Light的skin和button但是搭配上了Dark的searchbar,即是抽象工厂要解决的问题

我们定义一个最终产品类叫做page,page里包括了skin,button,searchbar。然后给出Light和Dark分别对这三个组件的实现,设计一个抽象工厂类,实现LightFactory和DarkFactory来装配page并返回指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>

class button {
public:
virtual void info() = 0;
virtual ~button(){};
};

class skin {
public:
virtual void info() = 0;
virtual ~skin(){};
};

class searchbar {
public:
virtual void info() = 0;
virtual ~searchbar(){};
};

class LightButton : public button {
public:
void info() override {
std::cout << "LightButton" << std::endl;
}
};

class DarkButton : public button {
public:
void info() override {
std::cout << "DarkButton" << std::endl;
}
};
class Lightskin : public skin {
public:
void info() override {
std::cout << "Lightskin" << std::endl;
}
};

class Darkskin : public skin {
public:
void info() override {
std::cout << "Darkskin" << std::endl;
}
};
class Lightsearchbar : public searchbar {
public:
void info() override {
std::cout << "Lightsearchbar" << std::endl;
}
};

class Darksearchbar : public searchbar {
public:
void info() override {
std::cout << "Darksearchbar" << std::endl;
}
};

class page {
public:
page(button *b, skin *s, searchbar *sc):
b(b), s(s), sc(sc) {

}
void show() {
b->info();
s->info();
sc->info();
}

~page() {
delete b;
delete s;
delete sc;
}
private:
button *b;
skin *s;
searchbar *sc;
};

class abstractFactory {
public:
virtual page* createPage() = 0;
virtual ~abstractFactory(){};
};

class LightFactory : public abstractFactory {
public:
page* createPage() override {
return new page(new LightButton, new Lightskin, new Lightsearchbar);
}
};

class DarkFactory : public abstractFactory {
public:
page* createPage() override {
return new page(new DarkButton, new Darkskin, new Darksearchbar);
}
};

int main() {
abstractFactory *abF = new DarkFactory();

page *p = abF->createPage();

p->show();

delete p;
delete abF;
return 0;
}