add Factory example

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@195 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
syntheticpp 2005-07-28 14:27:12 +00:00
parent 21e122256a
commit f4994cb86e
2 changed files with 321 additions and 0 deletions

232
examples/Factory.cpp Executable file
View file

@ -0,0 +1,232 @@
////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2005 by Peter Kuemmel
//
// Code covered by the MIT License
// The authors make no representations about the suitability of this software
// for any purpose. It is provided "as is" without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
// $Header$
//#define CLASS_LEVEL_THERADING
#include <iostream>
#include "loki/Factory.h"
#include "loki/Functor.h"
using Loki::Functor;
using Loki::Factory;
using Loki::SingletonHolder;
using std::cout;
using std::endl;
////////////////////////////////////////////
// Object to create: Product
// Constructor with 0 and 2 arguments
////////////////////////////////////////////
class AbstractProduct{};
class Product : public AbstractProduct
{
public:
Product(){}
Product( int, int ){}
};
///////////////////////////////////////////////////////////
// Factory for creation a Product object without parameters
///////////////////////////////////////////////////////////
typedef SingletonHolder
<
Factory< AbstractProduct, int >
>
PFactoryNull;
/////////////////////////////////////////////////////////////
// Factory for creation a Product object with 2 parameters
/////////////////////////////////////////////////////////////
typedef SingletonHolder
<
Factory< AbstractProduct, int, TYPELIST_2( int, int ) >
>
PFactory;
////////////////////////////////////////////////////
// Creator functions with different names
////////////////////////////////////////////////////
Product* createProductNull()
{
cout << "createProductNull()" << endl;
return new Product;
}
Product* createProductParm( int a, int b )
{
cout << "createProductParm( int a, int b ) " << endl;
return new Product( a, b );
}
///////////////////////////////////////////////////
// Overloaded creator functions
///////////////////////////////////////////////////
Product* createProductOver()
{
cout << "createProductOver()" << endl;
return new Product;
}
Product* createProductOver( int a, int b )
{
cout << "createProductOver( int a, int b )" << endl;
return new Product( a, b );
}
///////////////////////////////////////////////////
// Creator functions are polymorphic member functions
///////////////////////////////////////////////////
class AbstractCreator{
public:
virtual AbstractProduct* create() = 0;
virtual AbstractProduct* createParm( int, int ) = 0;
};
class Creator : public AbstractCreator{
public:
Creator(){};
AbstractProduct* create()
{
cout << "Creator::create()" << endl;
return new Product;
}
AbstractProduct* createParm( int a, int b )
{
cout << "Creator::create( int a, int b )" << endl;
return new Product( a,b );
}
};
///////////////////////////////////////////////////////////////
// Creator functions are member functions of a template class
///////////////////////////////////////////////////////////////
template< class T>
class CreatorT{
public:
CreatorT(){};
T* create()
{
cout << "CreatorT<T>::create()" << endl;
return new T;
}
T* createParm( int a, int b )
{
cout << "CreatorT<T>::create( int a, int b )" << endl;
return new T( a,b );
}
};
///////////////////////////////////////////////////////////////
// get creator functions on runntime
///////////////////////////////////////////////////////////////
typedef Functor<Product*,TYPELIST_2(int,int)> CreateFunctor;
typedef
SingletonHolder
<
Factory< AbstractProduct, int,TYPELIST_3(CreateFunctor,int,int) >
>
PFactoryFunctorParm;
Product* createProductRuntime(CreateFunctor func, int a, int b)
{
Product *p = func( a, b );
cout << " called by createProductRuntime(CreateFunctor func, int a, int b) " << endl;
return p;
}
///////////////////////////////////////
// Register creator functions
// No additional typdefs are necessary!
//////////////////////////////////////
AbstractCreator* c = new Creator;
CreatorT<Product> cT;
bool reg()
{
bool const ok1 = PFactoryNull::Instance().Register( 1, createProductNull );
bool const ok2 = PFactoryNull::Instance().Register( 2, (Product*(*)()) createProductOver );
bool const ok3 = PFactoryNull::Instance().Register( 3, c, &AbstractCreator::create );
bool const ok4 = PFactoryNull::Instance().Register( 4, &cT, &CreatorT<Product>::create );
bool const ok5 = PFactory::Instance().Register( 1, createProductParm );
bool const ok6 = PFactory::Instance().Register( 2, (Product*(*)(int,int))createProductOver );
bool const ok7 = PFactory::Instance().Register( 3, c, &AbstractCreator::createParm );
bool const ok8 = PFactory::Instance().Register( 4, &cT, &CreatorT<Product>::createParm );
bool const ok9 = PFactoryFunctorParm::Instance().Register( 1, createProductRuntime );
return ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 && ok9;
}
int main(int argc, char *argv[])
{
reg();
AbstractProduct* p;
cout << endl << "creator function is a simple function:" << endl;
p= PFactoryNull::Instance().CreateObject( 1 );
delete p;
p= PFactory::Instance().CreateObject( 1, 64,64 );
delete p;
cout << endl << "creator function is a overloaded function:" << endl;
p= PFactoryNull::Instance().CreateObject( 2 );
delete p;
p= PFactory::Instance().CreateObject( 2, 64,64 );
delete p;
cout << endl << "creator function is a member function:" << endl;
p= PFactoryNull::Instance().CreateObject( 3 );
delete p;
p= PFactory::Instance().CreateObject( 3, 64,64 );
delete p;
cout << endl << "creator function is a template member function" << endl;
p= PFactoryNull::Instance().CreateObject( 4 );
delete p;
p= PFactory::Instance().CreateObject( 4, 64,64 );
delete p;
CreateFunctor func1(createProductParm);
CreateFunctor func2(&cT, &CreatorT<Product>::createParm);
cout << endl << "creator function is a functor parameter" << endl;
p= PFactoryFunctorParm::Instance().CreateObject( 1, func1, 64,64 );
delete p;
p= PFactoryFunctorParm::Instance().CreateObject( 1, func2, 64,64 );
delete p;
cout << endl;
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
// $Log$
// Revision 1.1 2005/07/28 14:27:12 syntheticpp
// add Factory example
//

89
examples/Factory.dev Executable file
View file

@ -0,0 +1,89 @@
[Project]
FileName=Factory.dev
Name=Factory
UnitCount=3
Type=1
Ver=1
ObjFiles=
Includes=..\include
Libs=
PrivateResource=
ResourceIncludes=
MakeIncludes=
Compiler=
CppCompiler=-Wall -pedantic_@@_
Linker=
IsCpp=1
Icon=
ExeOutput=
ObjectOutput=
OverrideOutput=0
OverrideOutputName=Factory.exe
HostApplication=
Folders=
CommandLine=
UseCustomMakefile=0
CustomMakefile=Makefile.loki
IncludeVersionInfo=0
SupportXPThemes=0
CompilerSet=0
CompilerSettings=0000000000000001000000
[VersionInfo]
Major=0
Minor=1
Release=1
Build=1
LanguageID=1033
CharsetID=1252
CompanyName=
FileVersion=
FileDescription=Developed using the Dev-C++ IDE
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=
AutoIncBuildNr=0
[Unit4]
FileName=..\include\loki\Factory.h
CompileCpp=1
Folder=Factory
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit3]
FileName=Factory.cpp
CompileCpp=1
Folder=Factory
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit1]
FileName=..\src\SmallObj.cpp
CompileCpp=1
Folder=Factory
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit2]
FileName=..\include\loki\Factory.h
CompileCpp=1
Folder=Factory
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=