Помогите примерами паттернов
От: Каюга  
Дата: 08.01.07 04:01
Оценка:
Господа, огромная просьба, дайте исходники чего угодно не сильно сложного с использованием паттернов ( в основном интересует "абстрактная фабрика" ) желательно не куска кода( хотя и кусок сойдет ), а целиком, чтоб скомпилить и посмотреть, как вообще что работает( с комментами, пояснениями всякими было бы вообще здорово )...а то я в тупике...

Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)

Заранее премного благодарен.
Re: Помогите дебилу...
От: dotidot Россия  
Дата: 08.01.07 04:23
Оценка:
Здравствуйте, Каюга, Вы писали:

вообще дебилам помогают в спец. учреждениях. Так что думаю заголовок жестковат.

К>Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)

Первое что пришло в голову.
#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 читать лень
Re: Помогите дебилу...
От: Poirot Россия  
Дата: 08.01.07 06:44
Оценка:
Здравствуйте, Каюга, Вы писали:

К>Господа, огромная просьба, дайте исходники чего угодно не сильно сложного с использованием паттернов ( в основном интересует "абстрактная фабрика" ) желательно не куска кода( хотя и кусок сойдет ), а целиком, чтоб скомпилить и посмотреть, как вообще что работает( с комментами, пояснениями всякими было бы вообще здорово )...а то я в тупике...


К>Может у кого нибудь лабы по паттернам завалялись, курсовая какая нибудь... не жадничайте =)


К>Заранее премного благодарен.

Вообще еэто есть у Александревску. Вот что-то типа такого
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;
}

Сильно не пинать, но должно работать С наследованиями и прочим разбирайся сам в зависимомти от задачи — это тока пример
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.