Skip to content

Commit 6b0b677

Browse files
author
XuhuaHuang
committed
Upload creational pattern notes
1 parent dfe1164 commit 6b0b677

2 files changed

Lines changed: 189 additions & 0 deletions

File tree

DesignPattern/abstract_factory.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <iostream>
2+
#include <memory>
3+
4+
class monster_t {
5+
public:
6+
virtual ~monster_t() = default;
7+
8+
virtual void attack() const = 0;
9+
};
10+
11+
class wall_t {
12+
public:
13+
virtual ~wall_t() = default;
14+
15+
virtual void build() const = 0;
16+
};
17+
18+
class fire_monster_t : public monster_t {
19+
public:
20+
void attack() const override { std::cout << "Fire monster attacks with flames\n"; }
21+
};
22+
23+
class fire_wall_t : public wall_t {
24+
public:
25+
void build() const override { std::cout << "Building a fire wall\n"; }
26+
};
27+
28+
class ice_monster_t : public monster_t {
29+
public:
30+
void attack() const override { std::cout << "Ice monster attacks with frost\n"; }
31+
};
32+
33+
class ice_wall_t : public wall_t {
34+
public:
35+
void build() const override { std::cout << "Building an ice wall\n"; }
36+
};
37+
38+
class game_object_factory_t {
39+
public:
40+
virtual ~game_object_factory_t() = default;
41+
42+
virtual std::unique_ptr<monster_t> create_monster() const = 0;
43+
virtual std::unique_ptr<wall_t> create_wall() const = 0;
44+
};
45+
46+
class fire_game_object_factory_t : public game_object_factory_t {
47+
public:
48+
std::unique_ptr<monster_t> create_monster() const override { return std::make_unique<fire_monster_t>(); }
49+
50+
std::unique_ptr<wall_t> create_wall() const override { return std::make_unique<fire_wall_t>(); }
51+
};
52+
53+
class ice_game_object_factory_t : public game_object_factory_t {
54+
public:
55+
std::unique_ptr<monster_t> create_monster() const override { return std::make_unique<ice_monster_t>(); }
56+
57+
std::unique_ptr<wall_t> create_wall() const override { return std::make_unique<ice_wall_t>(); }
58+
};
59+
60+
class game_level_t {
61+
public:
62+
explicit game_level_t(const game_object_factory_t& factory) {
63+
monster = factory.create_monster();
64+
wall = factory.create_wall();
65+
}
66+
67+
void play() const {
68+
monster->attack();
69+
wall->build();
70+
}
71+
72+
private:
73+
std::unique_ptr<monster_t> monster;
74+
std::unique_ptr<wall_t> wall;
75+
};
76+
77+
int main() {
78+
std::cout << "=== Fire Level ===\n";
79+
fire_game_object_factory_t fire_factory;
80+
game_level_t fire_level(fire_factory);
81+
fire_level.play();
82+
83+
std::cout << "\n=== Ice Level ===\n";
84+
ice_game_object_factory_t ice_factory;
85+
game_level_t ice_level(ice_factory);
86+
ice_level.play();
87+
88+
return 0;
89+
}

DesignPattern/factory_method.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/**
2+
* @file factory_method.cpp
3+
* @author Xuhua Huang
4+
* @brief
5+
* @version 0.1
6+
* @date 2026-04-10
7+
*
8+
* @copyright Copyright (c) 2026
9+
*
10+
*/
11+
12+
#include <functional>
13+
#include <iostream>
14+
#include <map>
15+
#include <memory>
16+
#include <string>
17+
18+
class registrar_t {
19+
public:
20+
virtual ~registrar_t() = default;
21+
22+
virtual void admit_student(const std::string& name) const = 0;
23+
};
24+
25+
class computer_science_registrar_t : public registrar_t {
26+
public:
27+
void admit_student(const std::string& name) const override { std::cout << "CS registrar admitting " << name << "\n"; }
28+
};
29+
30+
class engineering_registrar_t : public registrar_t {
31+
public:
32+
void admit_student(const std::string& name) const override {
33+
std::cout << "Engineering registrar admitting " << name << "\n";
34+
}
35+
};
36+
37+
class math_registrar_t : public registrar_t {
38+
public:
39+
void admit_student(const std::string& name) const override {
40+
std::cout << "Math registrar admitting " << name << "\n";
41+
}
42+
};
43+
44+
class registrar_factory_t {
45+
public:
46+
virtual ~registrar_factory_t() = default;
47+
48+
// factory method
49+
virtual std::unique_ptr<registrar_t> create() const = 0;
50+
};
51+
52+
class cs_factory_t : public registrar_factory_t {
53+
public:
54+
std::unique_ptr<registrar_t> create() const override { return std::make_unique<computer_science_registrar_t>(); }
55+
};
56+
57+
class eng_factory_t : public registrar_factory_t {
58+
public:
59+
std::unique_ptr<registrar_t> create() const override { return std::make_unique<engineering_registrar_t>(); }
60+
};
61+
62+
class math_factory_t : public registrar_factory_t {
63+
public:
64+
std::unique_ptr<registrar_t> create() const override { return std::make_unique<math_registrar_t>(); }
65+
};
66+
67+
void enroll_students(
68+
const std::map<std::string, std::unique_ptr<registrar_factory_t>>& factories,
69+
const std::map<std::string, std::string>& students_to_enroll
70+
) {
71+
for (const auto& [student, program] : students_to_enroll) {
72+
auto it = factories.find(program);
73+
if (it != factories.end()) {
74+
std::unique_ptr<registrar_t> registrar = it->second->create(); // factory method
75+
registrar->admit_student(student);
76+
}
77+
}
78+
}
79+
80+
using registrar_factory_fn_t = std::function<std::unique_ptr<registrar_t>()>;
81+
82+
int main() {
83+
std::map<std::string, std::unique_ptr<registrar_factory_t>> factories;
84+
85+
// std::map<std::string, registrar_factory_fn_t> factories;
86+
// factories["cs"] = [] { return std::make_unique<computer_science_registrar_t>(); };
87+
// factories["eng"] = [] { return std::make_unique<engineering_registrar_t>(); };
88+
89+
factories["cs"] = std::make_unique<cs_factory_t>();
90+
factories["eng"] = std::make_unique<eng_factory_t>();
91+
factories["math"] = std::make_unique<math_factory_t>();
92+
93+
std::map<std::string, std::string> students_to_enroll{
94+
{"jeff", "cs" },
95+
{"bob", "eng" },
96+
{"jane", "math"}
97+
};
98+
99+
enroll_students(factories, students_to_enroll);
100+
}

0 commit comments

Comments
 (0)