-
Notifications
You must be signed in to change notification settings - Fork 0
/
8.cpp
129 lines (102 loc) · 2.4 KB
/
8.cpp
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <loki/Factory.h>
#include <iostream>
#include <string>
using namespace Loki;
using namespace std;
class Fruit
{
public:
virtual ~Fruit() = 0;
virtual void Say() = 0;
};
Fruit::~Fruit() {}
class Apple : public Fruit
{
public:
virtual void Say() { cout << "I'm an Apple\n"; }
};
class Pear : public Fruit
{
public:
virtual void Say() { cout << "I'm a Pear\n"; }
};
Fruit* CreateApple() {return new Apple;}
Fruit* CreatePear() {return new Pear;}
Fruit* CloneApple(const Fruit* ref) {return new Apple( *((Apple*)(ref)) );}
Fruit* ClonePear(const Fruit* ref) {return new Pear( *((Pear*)(ref)) );}
enum FruitInd{
APPLE,
PEAR
};
#undef ENABLE_NEW_FACTORY_CODE
/*
template <
class AbstractProduct,
typename IdentifierType,
typename ProductCreator = AbstractProduct* (*)(),
template<typename, class>
class FactoryErrorPolicy = DefaultFactoryError
>
class Factory;
*/
typedef Factory<Fruit, FruitInd> Factory_t;
/*
template <
class AbstractProduct,
class ProductCreator =
AbstractProduct* (*)(const AbstractProduct*),
template<typename, class>
class FactoryErrorPolicy = DefaultFactoryError
>
class CloneFactory
*/
typedef CloneFactory<Fruit> CloneFactory_t;
int main()
{
// Factory Example
Factory_t f;
f.Register(APPLE,CreateApple);
f.Register(PEAR,CreatePear);
Fruit* a = f.CreateObject(APPLE);
Fruit* p = f.CreateObject(PEAR);
a->Say();
p->Say();
if (a) { delete a; a = NULL; }
f.Unregister(APPLE);
try {
a = f.CreateObject(APPLE);
}
catch (std::exception &err)
{
std::cout << "ERROR: " << err.what() << std::endl;
}
if (a) { delete a; a = NULL; }
if (p) { delete p; p = NULL; }
f.Register(APPLE,CreateApple);
f.Register(PEAR,CreatePear);
a = f.CreateObject(APPLE);
p = f.CreateObject(PEAR);
// CloneFactory Example
CloneFactory_t cf;
Fruit* ca = NULL;
Fruit* cp = NULL;
try {
ca = cf.CreateObject(a);
}
catch (std::exception &err)
{
std::cout << "ERROR: " << err.what() << std::endl;
}
cf.Register(typeid(Apple), CloneApple);
cf.Register(typeid(Pear), ClonePear);
ca = cf.CreateObject(a);
cp = cf.CreateObject(p);
ca->Say();
cp->Say();
if (a) { delete a; a = NULL; }
if (p) { delete p; p = NULL; }
if (ca) { delete ca; ca = NULL; }
if (cp) { delete cp; cp = NULL; }
return 0;
}
// clang++ -std=c++11 -I. loki-0.1.7/src/SmallObj.cpp loki-0.1.7/src/Singleton.cpp 8.cpp