『阅读笔记』设计模式1
cheny658 Lv3

工厂方法模式

讲道理就是最简单的纯虚函数继承模式,一个提供纯虚函数接口(假设叫process())的类做Base Class,然后需要用到的类分别实现这个接口后,用一个工厂调BaseClass的这个方法就完事了

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
class Base {
public:
Base() = default;
virtual void process() const = 0;
};

class Derived1 : public Base {
public:
virtual void process() const override {
std::cout << "Here is Derived1 process logic" << std::endl;
};
};

class Derived2 : public Base {
public:
virtual void process() const override {
std::cout << "Here is Derived2 process logic" << std::endl;
};
};

void call_derived(Base* ptr) {
ptr->process();
}

int main() {
Derived1 d1;
Derived2 d2;
call_derived(&d1);
call_derived(&d2);
return 0;
}

抽象工厂模式

总结就是用一个factory接口类包含要用到的接口类,这样就可以保证一次定制多个想用的类到一个特定的factory派生类里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base1 {
public:
Base1() = default;
virtual process() const = 0;
}

class Base2 {
public:
Base2() = default;
virtual process() const = 0;
}

class Factory {
public:
Base1* createBase1() const = 0;
Base2* createBase2() const = 0;
}

生成器模式

利用一个生成器类配置需要用到的类工具,数量和类型都可以定制

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
class Base {
public:
Base() = default;
virtual process() const = 0;
}

class Derived1 : public Base {
public:
virtual void process() const override {
std::cout << "Here is Derived1 process logic" << std::endl;
};
};

class Derived2 : public Base {
public:
virtual void process() const override {
std::cout << "Here is Derived2 process logic" << std::endl;
};
};

class Generator {
public:
void add(const std::string &key, std::shared_ptr<Base> &val) {
content_.emplace(key, val);
};

private:
std::map<std::string, std::shared_ptr<Base>> content_;
}

int main() {
auto d1 = std::make_shared<Derived1>();
auto d2 = std::make_shared<Derived2>();
Generator g1;
g1.add("k1", d1);

Generator g2;
g2.add("k2", d2);

Generator g3;
g3.add("k1", d1);
g3.add("k2", d2);
}

感觉总结的不一定对,但八九不离十吧,这两天还真用到了生成器模式(应该是吧),以后多留意留意。