Kyle Chen's Blog

Action speaks louder than Words

0%

工厂模式的C++实现

ref: 工厂模式

方法工厂

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
#include<iostream>
using namespace std;

class Shoe{
public:
virtual ~Shoe(){};
virtual void show() = 0;

};

class NikeShoe:public Shoe{
public:
void show(){

cout<<"我是Nike"<<endl;

}

};

class Factory{
public:
virtual ~Factory(){};
virtual Shoe* Makeshoe() = 0;

};

class NikeFactory : public Factory{
public:
Shoe* Makeshoe() {
Shoe* tmp = new NikeShoe;
return tmp;
}


};

int main()
{

//Step1 指定工厂
Factory* f = new NikeFactory();
//Step2 工厂生产出鞋子
Shoe* s = f->Makeshoe();
//Step3 打出口号
s->show();

// cout<<"hello world"<<endl;
}

抽象工厂

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
#include<iostream>
using namespace std;

class Shoe{
public:
virtual ~Shoe(){};
virtual void show() = 0;

};
class NikeShoe:public Shoe{
public:
void show(){

cout<<"我是Nike的鞋子"<<endl;

}

};


class Cloth{
public:
virtual ~Cloth(){};
virtual void show() = 0;

};
class NikeCloth:public Cloth{
public:
void show(){

cout<<"我是Nike的衣服"<<endl;

}

};

class Factory{
public:
virtual ~Factory(){};
virtual Shoe* Makeshoe() = 0;
virtual Cloth* Makecloth() = 0;

};


class NikeFactory : public Factory{
public:
Shoe* Makeshoe() {
Shoe* tmp = new NikeShoe;
return tmp;
}
Cloth* Makecloth() {
Cloth* tmp = new NikeCloth;
return tmp;
}
};


int main()
{

//Step1 指定工厂
Factory* f = new NikeFactory();
//Step2 工厂生产出鞋子
Shoe* s = f->Makeshoe();
//Step3 打出口号
s->show();

//Step2 工厂生产衣服
Cloth* c = f->Makecloth();
//Step3 打出口号
c->show();

}

模板工厂

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
#include<iostream>
using namespace std;

#include<iostream>
using namespace std;

class Shoe{
public:
virtual ~Shoe(){};
virtual void show() = 0;

};
class NikeShoe:public Shoe{
public:
void show(){

cout<<"我是Nike的鞋子"<<endl;

}

};


class Cloth{
public:
virtual ~Cloth(){};
virtual void show() = 0;

};
class NikeCloth:public Cloth{
public:
void show(){

cout<<"我是Nike的衣服"<<endl;

}

};

template<class AbsProductType_t>
class Factory{
public:
virtual ~Factory(){};
virtual AbsProductType_t* MakeProduct() = 0;


};

template<class AbsProductType_t,class ConcreatProductType_t>
class ConcreatFactory : public Factory<AbsProductType_t>{
public:

AbsProductType_t* MakeProduct() {
AbsProductType_t* tmp = new ConcreatProductType_t;
return tmp;
}

};




int main(){
ConcreatFactory<Cloth,NikeCloth> f;
Cloth* ns = f.MakeProduct();
ns->show();
}