与前面两个工厂不同的是,抽象工厂提供的产品不是同一个类型的东西,而是一系列配套的不同产品。例如一个网站可能会有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; }
|