Господа, огромная просьба, дайте исходники чего угодно не сильно сложного с использованием паттернов ( в основном интересует "абстрактная фабрика" ) желательно не куска кода( хотя и кусок сойдет ), а целиком, чтоб скомпилить и посмотреть, как вообще что работает( с комментами, пояснениями всякими было бы вообще здорово )...а то я в тупике...
Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)
Заранее премного благодарен.
Здравствуйте, Каюга, Вы писали:
вообще дебилам помогают в спец. учреждениях. Так что думаю заголовок жестковат.
К>Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)
Первое что пришло в голову.
#include <iostream>
using namespace std;
struct IProduct
{
virtual void printName()=0;
virtual ~IProduct(){}
};
struct IFactory
{
virtual IProduct* newProduct()=0;
virtual ~IFactory(){}
};
struct ConcreteProduct1: public IProduct
{
void printName()
{
cout<<"Product 1";
}
};
struct ConcreteProduct2: public IProduct
{
void printName()
{
cout<<"Product 2";
}
};
struct ConcreteFactory1:public IFactory
{
IProduct* newProduct()
{
return new ConcreteProduct1;
}
};
struct ConcreteFactory2:public IFactory
{
IProduct* newProduct()
{
return new ConcreteProduct2;
}
};
void printProduct(IFactory* factory)
{
// Какой конкретный продукт создасться зависит от конкретной фабрики.
// В этом вся и фишка. Вынесли создание из printProduct, абстрагировавшись
// от конкретных родуктов и фабрик - работаем только с IFactory и IProduct
// Что позволяет расширять ассортимент продуктов, не меняя этой функции. ВотЪ.
// От просто виртуальных функций отличается тем что надо именно создавать продукт.
// Подробнее читать ГоФ и гугль.
IProduct* product = factory->newProduct();
product->printName();
cout<<"\n";
delete product;
}
int
main()
{
ConcreteFactory1 f1;
ConcreteFactory2 f2;
printProduct(&f1);
printProduct(&f2);
}
К>Заранее премного благодарен.
ох уж мне эти лентяи, которым GoF читать лень
Здравствуйте, Каюга, Вы писали:
К>Господа, огромная просьба, дайте исходники чего угодно не сильно сложного с использованием паттернов ( в основном интересует "абстрактная фабрика" ) желательно не куска кода( хотя и кусок сойдет ), а целиком, чтоб скомпилить и посмотреть, как вообще что работает( с комментами, пояснениями всякими было бы вообще здорово )...а то я в тупике...
К>Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)
К>Заранее премного благодарен.
Вообще еэто есть у Александревску. Вот что-то типа такого
factory.h:
#ifndef _CLASS_FACTORY_H_
#define _CLASS_FACTORY_H_
#include <map>
template <class ProductKey, class AbstractProduct>
class ClassFactory
{
public:
typedef AbstractProduct* (*ProductCreator)();
private:
typedef std::map<ProductKey, ProductCreator> REGISTARTION_LIST_T;
typedef typename REGISTARTION_LIST_T::iterator I_REGISTARTION_LIST_T;
ClassFactory() {};
ClassFactory(const ClassFactory&) {};
ClassFactory& operator=(const ClassFactory&) {};
REGISTARTION_LIST_T m_regList;
public:
static ClassFactory& instance()
{
static ClassFactory<ProductKey, AbstractProduct> objFactorySingleton;
return objFactorySingleton;
}
bool RegisterClass(const ProductKey& Key, ProductCreator Creator)
{
I_REGISTARTION_LIST_T i_item = m_regList.find(Key);
if (i_item == m_regList.end())
{
m_regList[Key] = Creator;
return true;
}
return false;
}
bool UnregisterClass(const ProductKey& Key)
{
return m_regList.erase(Key) == 1 ? true : false;
}
AbstractProduct* CreateObject(const ProductKey& Key)
{
I_REGISTARTION_LIST_T i_item = m_regList.find(Key);
if (i_item == m_regList.end())
{
return NULL;
}
return i_item->second();
}
AbstractProduct* CreateObject(const ProductKey& Key)
{
return CreateObject(Key, objParams);
}
};
#endif
test.cpp:
#include <iostream>
#include <string>
class IShape
{
public:
virtual const char * getName() = 0;
};
class CDot: public IShape
{
const char * getName()
{
return "Dot";
}
static IShape * CreateDot()
{
return new CDot();
}
};
//несколько других классво реализующий интерфейс IShape
typedef ClassFactory<std::string, IShape> ShapeFactory;
int main(int argc, char** argv)
{
ShapeFactory::instance().RegisterClass("Dot", CDot::CreateDot);
//регестрируем несколько других классво реализующий интерфейс IShape
IShape * pShape = ShapeFactory::instance().CreateObject(argv[1]);
if (pShape == NULL)
{
std::cout << "Unknown class name: " << argv[1] << std::endl;
return 1;
}
std::count << "Object created: " << pShape->getName() << std::endl;
return 1;
}
Сильно не пинать, но должно работать

С наследованиями и прочим разбирайся сам в зависимомти от задачи — это тока пример