C++:抽象工厂可以处理模板类吗?

C++:抽象工厂可以处理模板类吗?,c++,templates,factory,abstract-factory,class-template,C++,Templates,Factory,Abstract Factory,Class Template,我有一个使用模板的类层次结构: template <typename T> class BaseClass { public: BaseClass(const std::string& inputName) : myMember(std::make_shared<T>(inputName)) {} private: const std::shared_ptr<T> myMember; }; cl

我有一个使用模板的类层次结构:

template <typename T>
class BaseClass
{
public:
    BaseClass(const std::string& inputName)
        :
        myMember(std::make_shared<T>(inputName))
    {}
private:
    const std::shared_ptr<T> myMember;
};

class UsedByDerived 
{
public:
    UsedByDerived(const std::string& inputName)
        :
        myInputName(inputName)
    {}
private:
    const std::string myInputName;
};

class DerivedClass : public BaseClass<UsedByDerived>
{
public:
    DerivedClass()
        :
        BaseClass<UsedByDerived>("X")
    {}
};
我有多个这样的派生类,每个派生类都可以有不同的构造函数签名,我想用一个抽象工厂来处理实例化。基地工厂是

template <typename T>
class BaseFactory
{
public:
    virtual std::shared_ptr<BaseClass<T>> createProduct() = 0;
};
我想知道派生的工厂类应该是什么样子,或者这是否会起作用?但是不清楚它应该如何实现…:

class DerivedFactory
{
public:
    std::shared_ptr<BaseClass</* what should this be? */>> createProduct()
    {
        // what should this return?
    }
};

随着python方法学的召唤,我们都是成年人。。您可以创建一个模板工厂类。但是你应该吗

为了回答这个问题,你需要考虑工厂模式是用来处理像汽车和汽车工厂这样的物体的。p> 你从宝马工厂得到一辆宝马。当它需要维修时,你把它带回宝马工厂。工厂将处理修改和修复

如果你把它带到梅赛德斯工厂,宝马不会对你很满意。因为他们设计的汽车既快又安全。梅赛德斯只是希望它安全。所以他们缩小了你的引擎,去掉了车身套件。现在,宝马不再懂得如何修理汽车,如果它坏了。所以宝马工厂不再工作了

拥有多个不同工厂的清单比拥有一个工厂拥有多辆不同汽车的清单要好

然而,可以减轻扭曲这个类的压力的是将工厂模式与访问者模式甚至装饰者模式结合起来。或者两者兼而有之。这将允许您在不更改类的情况下为类添加职责


您甚至可以在工厂中使用访问者/装饰者模式

定义BaseFactory没有什么意义,因为BaseFactory是BaseFactory的不同类型


类似的基类。不同的实例化是不可互换的

谢谢。你认为这是如何处理的?我真的不想在客户端进行显式的大小写转换。基类的非模板成员是什么?您可以将其拆分为非模板接口和模板抽象类。