通用工厂类Factory(C++实现)

灵光一闪:
        抽象工厂模式经常被使用,那么同时也会多次写相同或类似的代码。能不能设计一个通用的工厂类,以避免重复设计工厂类呢?


        先回忆一下基础的工厂类设计。
 	class Button
        {
        };

        class LinuxButton : public Button
        {
        };

        class WindowsButton: public Button
        {
        };

        class AbstractFactory
        {
         public:
            Button* create Button() = 0;
        };

        class LinuxConcreteFactory : public AbstractFactory
        {
         public:
            Button* createButton()
            {
                return new LinuxButton ;
            }
        };
        
        class WindowsConcreteFactory : public AbstractFactory
        {
        pulbic:
            Base *createBase()
            {
                return new WindowsButton;
            }
        };


         以上是一个基本的抽象工厂类。这套代码会根据不同的操作实现不同的控件,比如运行在linux下,那么会要产生一个Linux格式的Button,运行在Windows下,那么会产生Windows的Button。很多用过工厂类的猿们应该都有写过这样的工厂。但是这样的工厂有很大的问题:
  1. 有新产品类时,要修改AbstractFactory的接口,同时要改变所有具体工厂去实现新的创建对象函数。比如,现在要加一个Label的控件,那么会有Label、LinuxLabel和WindowsLabel类。这时就要去修改AbstractFactory的接口,然后所有实现类都要去实现新的函数。
  2. 要记住每个类创建对象的对应函数,当然,名字取得得当,这不是问题,就像上面的例子一样,对于类Button,创建一个createButton的函数。
  3. 当要使用这个工厂创建对象的类非常多时,这时工厂的接口就非常大。
  4. 当具体工厂的个数比较多时,这样实现具体工厂就更加麻烦。比如,这时要加上Mac系统的控件,此时就得去新建一个MacConcreteFactory的类,并去继承AbstractFactory类,然后实现所以函数。

         那么有没有比较简便点的方法呢?

=============================================================================
         下面给出一个《C++ API设计》这本书的一个工厂类的设计。
        Button* createLinuxButton()
        {
            return new LinuxButton;
        }

        Button *createWindowsButton()
        {
            return new WindowsButton;
        }

        class ButtonFactoryEx
        {
        public:
                void registerClass(const string &name, Button* (*callback)())
                {
                    cm[name] = callback;
                }

                Button* create(const string &name)
                {
                    CreateMap::iterator it = cm.find(name);
                    if (it != cm.end())
                    {
                        return (*(it->second))();
                    }
                    else
                    {
                        return NULL;
                    }
                }
                // ...省略一些其他不用介绍的函数,可以参考《C++ API设计》
        private:
                typedef Button* (*CreateCallback)();
                typedef map<string, CreateCallback> CreateMaps;
                CreateMaps cm;
        };


阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
工厂模式是一种常用的设计模式,它可以将对象的创建与使用分离,使得客户端代码不需要知道对象的具体创建过程。在 C++ 中,可以通过抽象工厂和具体工厂实现工厂模式。 下面是一个简单的工厂模式示例代码: ```cpp #include <iostream> // 抽象产品 class Product { public: virtual void use() = 0; }; // 具体产品 A class ConcreteProductA : public Product { public: void use() override { std::cout << "I'm a ConcreteProductA." << std::endl; } }; // 具体产品 B class ConcreteProductB : public Product { public: void use() override { std::cout << "I'm a ConcreteProductB." << std::endl; } }; // 抽象工厂 class Factory { public: virtual Product* createProduct() = 0; }; // 具体工厂 A class ConcreteFactoryA : public Factory { public: Product* createProduct() override { return new ConcreteProductA(); } }; // 具体工厂 B class ConcreteFactoryB : public Factory { public: Product* createProduct() override { return new ConcreteProductB(); } }; int main() { // 创建工厂 A Factory* factoryA = new ConcreteFactoryA(); // 创建产品 A Product* productA = factoryA->createProduct(); // 使用产品 A productA->use(); // 创建工厂 B Factory* factoryB = new ConcreteFactoryB(); // 创建产品 B Product* productB = factoryB->createProduct(); // 使用产品 B productB->use(); // 释放资源 delete productA; delete productB; delete factoryA; delete factoryB; return 0; } ``` 在上面的代码中,`Product` 是抽象产品,`ConcreteProductA` 和 `ConcreteProductB` 是具体产品。`Factory` 是抽象工厂,`ConcreteFactoryA` 和 `ConcreteFactoryB` 是具体工厂。客户端通过具体工厂来创建具体产品的实例,从而实现了对象的创建与使用分离。 在实际使用中,可以通过工厂模式来创建一些复杂的对象或者对象的组合,以便更好地管理和维护代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tenfyzhong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值