工厂模式

单看简单工厂,工厂方法,抽象工厂定义和网上的一些小例子不难,但在我们项目里面和经理写的一个关于包的使用的一个抽象工厂完全傻眼了
但看这三种工厂模式http://www.jellythink.com/archives/category/programdesign/designpattern 讲的很好
我们项目里面没有简单工厂的用法,用工厂用法,就是那个有名的定时器
工厂只是这里面的一部分,其他的用法还有
工厂方法每个工厂只能创建一种产品,当我们有很多类型的产品要创建时,就需要很多工厂,这些工厂类不便于管理,这个是弊端
好处就是我们通过工厂方法创建产品,其内部的工厂子类决定创建那种类型的产品,返回基类指针,实现了面向接口编程,当产生新产品时无需更改原来的代码只需添加一个相应工厂即可
不像简单工厂还需修改工厂内部的switch结构,打破了开放-封闭原则

1.工厂方法的应用
讲讲这个定时器,定时器工厂只有一个工厂就是定时器工厂,而这个工厂内部就是创建一个定时器
// 工厂方法的应用
{
    int sec = 0;
    // 创建时间工厂
    std::shared_ptr<I_TimerFactory> spTimerFactory (new TimerFactory);

    // 用工厂创建一个定时器
    std::shared_ptr<I_Timer> spTimer = spTimerFactory->createTimer();
    spTimer->setInterval(1000); // 设置定时器间隔1000毫秒
    spTimer->regTimer([&sec]()
    {
        std::cout << "Time : " << ++sec << std::endl;
    });
    spTimer->start(); // 启动定时器

    // 驱动定时器
    while(sec < 10)
    {
        spTimerFactory->driveTimer();
        Sleep(2);
    }
}
//关于如果定时的,刚开始看麻烦,其实不难,内部根据tick,spTimerFactory->driveTimer();就是看是否到达时间,如果到底调用注册的函数
//刚开始想这个和工厂能有什么关系,没想到还真是工厂方法
    // 抽象工厂的应用
    {
        Creator<Packet>* pFactory = new Creator<Packet>;//创建抽象工厂

        //生成具体工厂,并注册进抽象工厂
        pFactory->RegisterCreator<LoginPacket>(ePktType_Login);
        pFactory->RegisterCreator<LogOutPacket>(ePktType_LogOut);
        
        //根据枚举调用相应的具体包工厂函数
        Packet* pLoginPkt = pFactory->CreateProduct(ePktType_Login);
        Packet* pLogOutPkt = pFactory->CreateProduct(ePktType_LogOut);

        pLoginPkt->Send();
        pLogOutPkt->Send();

        delete pLoginPkt;
        delete pLogOutPkt;
        //清理
        pFactory->UnRegisterAllCreators();
        delete pFactory;
        pFactory = nullptr;
    }
//关键我在想他这个和抽象工厂有什么关系,不还是针对不同的包创建了很多工厂吗,或许是我没理解抽象工厂的真正含义,这里面还有很多没弄懂

已将相关代码上传到例子中

posted @ 2015-02-26 17:25  zzyoucan  阅读(209)  评论(0编辑  收藏  举报