Skip to content

Commit 771bccc

Browse files
committedFeb 9, 2018
abstract duck factory realization
1 parent 8b56911 commit 771bccc

15 files changed

+273
-17
lines changed
 

‎Factory/.gitignore

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# This file is used to ignore files which are generated
2+
# ----------------------------------------------------------------------------
3+
4+
*~
5+
*.autosave
6+
*.a
7+
*.core
8+
*.moc
9+
*.o
10+
*.obj
11+
*.orig
12+
*.rej
13+
*.so
14+
*.so.*
15+
*_pch.h.cpp
16+
*_resource.rc
17+
*.qm
18+
.#*
19+
*.*#
20+
core
21+
!core/
22+
tags
23+
.DS_Store
24+
*.debug
25+
Makefile*
26+
*.prl
27+
*.app
28+
moc_*.cpp
29+
ui_*.h
30+
qrc_*.cpp
31+
Thumbs.db
32+
*.res
33+
*.rc
34+
/.qmake.cache
35+
/.qmake.stash
36+
37+
# qtcreator generated files
38+
*.pro.user*
39+
40+
# xemacs temporary files
41+
*.flc
42+
43+
# Vim temporary files
44+
.*.swp
45+
46+
# Visual Studio generated files
47+
*.ib_pdb_index
48+
*.idb
49+
*.ilk
50+
*.pdb
51+
*.sln
52+
*.suo
53+
*.vcproj
54+
*vcproj.*.*.user
55+
*.ncb
56+
*.sdf
57+
*.opensdf
58+
*.vcxproj
59+
*vcxproj.*
60+
61+
# MinGW generated files
62+
*.Debug
63+
*.Release
64+
65+
# Python byte code
66+
*.pyc
67+
68+
# Binaries
69+
# --------
70+
*.dll
71+
*.exe
72+
73+

‎Factory/Factory.pro

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
TEMPLATE = app
2+
CONFIG += console c++11
3+
CONFIG -= app_bundle
4+
CONFIG -= qt
5+
6+
SOURCES += main.cpp \
7+
pizza.cpp
8+
9+
HEADERS += \
10+
pizza.h
11+

‎Factory/main.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
int main()
6+
{
7+
cout << "Hello World!" << endl;
8+
return 0;
9+
}
10+

‎Factory/pizza.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "pizza.h"
2+
3+
Pizza::Pizza()
4+
{
5+
6+
}
7+

‎Factory/pizza.h

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef PIZZA_H
2+
#define PIZZA_H
3+
4+
5+
class Pizza
6+
{
7+
public:
8+
Pizza();
9+
};
10+
11+
#endif // PIZZA_H

‎Strategy/Strategy.pro

+10-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ SOURCES += main.cpp \
1111
realduck.cpp \
1212
rubberduck.cpp \
1313
woodenduck.cpp \
14+
decorativeduck.cpp \
15+
abstractduckfactory.cpp \
1416
ducksrategy.cpp \
15-
decorativeduck.cpp
17+
decorativeduckfactory.cpp \
18+
duckfactory.cpp \
19+
flock.cpp
1620

1721
DISTFILES += \
1822
Strategy.pro.user \
@@ -27,5 +31,9 @@ HEADERS += \
2731
realduck.h \
2832
rubberduck.h \
2933
woodenduck.h \
30-
decorativeduck.h
34+
decorativeduck.h \
35+
abstractduckfactory.h \
36+
decorativeduckfactory.h \
37+
duckfactory.h \
38+
flock.h
3139

‎Strategy/abstractduckfactory.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "abstractduckfactory.h"
2+
3+
AbstractDuckFactory::AbstractDuckFactory()
4+
{
5+
6+
}
7+

‎Strategy/abstractduckfactory.h

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef ABSTRACTDUCKFACTORY_H
2+
#define ABSTRACTDUCKFACTORY_H
3+
#include "duck.h"
4+
5+
class AbstractDuckFactory
6+
{
7+
public:
8+
AbstractDuckFactory();
9+
virtual Duck* createRealDuck()=0;
10+
virtual Duck* createWoodenDuck()=0;
11+
virtual Duck* createRubberDuck()=0;
12+
13+
};
14+
15+
#endif // ABSTRACTDUCKFACTORY_H

‎Strategy/decorativeduckfactory.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "decorativeduckfactory.h"
2+
#include "decorativeduck.h"
3+
#include "realduck.h"
4+
#include "realduckstrategy.h"
5+
#include "woodenduck.h"
6+
#include "woodenstrategy.h"
7+
#include "rubberduck.h"
8+
#include "rubberstrategy.h"
9+
10+
DecorativeDuckFactory::DecorativeDuckFactory()
11+
{
12+
13+
}
14+
15+
Duck* DecorativeDuckFactory::createRealDuck()
16+
{
17+
return new DecorativeDuck(new RealDuck(new RealDuckStrategy()));
18+
}
19+
20+
Duck* DecorativeDuckFactory::createWoodenDuck()
21+
{
22+
return new DecorativeDuck(new WoodenDuck(new WoodenStrategy()));
23+
}
24+
Duck* DecorativeDuckFactory::createRubberDuck()
25+
{
26+
return new DecorativeDuck(new RubberDuck(new RubberStrategy()));
27+
}

‎Strategy/decorativeduckfactory.h

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef DECORATIVEDUCKFACTORY_H
2+
#define DECORATIVEDUCKFACTORY_H
3+
#include "abstractduckfactory.h"
4+
#include "duck.h"
5+
6+
class DecorativeDuckFactory: public AbstractDuckFactory
7+
{
8+
public:
9+
DecorativeDuckFactory();
10+
virtual Duck* createRealDuck();
11+
virtual Duck* createWoodenDuck();
12+
virtual Duck* createRubberDuck();
13+
};
14+
15+
#endif // DECORATIVEDUCKFACTORY_H

‎Strategy/duckfactory.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "duckfactory.h"
2+
#include "realduck.h"
3+
#include "realduckstrategy.h"
4+
#include "woodenduck.h"
5+
#include "woodenstrategy.h"
6+
#include "rubberduck.h"
7+
#include "rubberstrategy.h"
8+
DuckFactory::DuckFactory()
9+
{
10+
11+
}
12+
Duck* DuckFactory::createRealDuck()
13+
{
14+
return new RealDuck(new RealDuckStrategy());
15+
}
16+
17+
Duck* DuckFactory::createWoodenDuck()
18+
{
19+
return new WoodenDuck(new WoodenStrategy());
20+
}
21+
Duck* DuckFactory::createRubberDuck()
22+
{
23+
return new RubberDuck(new RubberStrategy());
24+
}

‎Strategy/duckfactory.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef DUCKFACTORY_H
2+
#define DUCKFACTORY_H
3+
#include"abstractduckfactory.h"
4+
5+
class DuckFactory : public AbstractDuckFactory
6+
{
7+
public:
8+
DuckFactory();
9+
virtual Duck* createRealDuck();
10+
virtual Duck* createWoodenDuck();
11+
virtual Duck* createRubberDuck();
12+
};
13+
14+
#endif // DUCKFACTORY_H

‎Strategy/flock.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "flock.h"
2+
3+
Flock::Flock()
4+
{
5+
6+
}
7+

‎Strategy/flock.h

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef FLOCK_H
2+
#define FLOCK_H
3+
#include <vector>
4+
#include "duck.h"
5+
#include "abstractduckfactory.h"
6+
7+
class Flock
8+
{
9+
std::vector<Duck*> ducks;
10+
public:
11+
Flock();
12+
virtual void addDucks(AbstractDuckFactory& factory)=0;
13+
virtual void useDuckStrategy()=0;
14+
};
15+
16+
#endif // FLOCK_H

‎Strategy/main.cpp

+26-15
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,56 @@
11
#include <iostream>
22
#include <vector>
33
#include "duck.h"
4-
#include "realduck.h"
5-
#include "rubberduck.h"
6-
#include "woodenduck.h"
7-
#include "woodenstrategy.h"
8-
#include "realduckstrategy.h"
9-
#include "rubberstrategy.h"
104
#include "decorativeduck.h"
11-
5+
#include "abstractduckfactory.h"
6+
#include "duckfactory.h"
7+
#include "decorativeduckfactory.h"
128
using namespace std;
139

1410
int main()
1511
{
16-
vector<DecorativeDuck*> ducks;
12+
vector<Duck*> decducks;
13+
vector <Duck*> normducks;
14+
AbstractDuckFactory* decDucksFactory = new DecorativeDuckFactory();
15+
AbstractDuckFactory* normDucksFactory = new DuckFactory();
16+
17+
1718
for (int i = 0; i < 10; i++)
1819
{
1920
switch (i%3)
2021
{
2122
case 0:
22-
ducks.push_back(new DecorativeDuck(new RealDuck(new RealDuckStrategy())));
23+
decducks.push_back(decDucksFactory->createRealDuck());
24+
normducks.push_back(normDucksFactory->createRealDuck());
2325
break;
2426
case 1:
25-
ducks.push_back(new DecorativeDuck(new WoodenDuck(new WoodenStrategy())));
27+
decducks.push_back(decDucksFactory->createWoodenDuck());
28+
normducks.push_back(normDucksFactory->createWoodenDuck());
2629
break;
2730
case 2:
28-
ducks.push_back(new DecorativeDuck(new RubberDuck(new RubberStrategy())));
31+
decducks.push_back(decDucksFactory->createRubberDuck());
32+
normducks.push_back(normDucksFactory->createRubberDuck());
2933
break;
3034
}
3135
}
32-
for (auto duck : ducks)
36+
for (auto duck : normducks)
3337
{
3438
duck->useStrategy();
3539

40+
}
41+
for (auto duck : decducks)
42+
{
43+
duck->useStrategy();
44+
3645
}
3746
int krya=0;
38-
for (auto duck : ducks)
47+
for (auto duck : decducks)
3948
{
40-
krya += duck->getCount();
49+
auto d = dynamic_cast<DecorativeDuck*>(duck);
50+
if (d!=nullptr)
51+
krya += d->getCount();
4152

4253
}
43-
std::cout << krya << std::endl;
54+
std::cout << "\nnumber of quaks = "<< krya << std::endl;
4455

4556
}

0 commit comments

Comments
 (0)
Please sign in to comment.