请教一个Factory模式的问题

rabbit729 rabbit729 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面是我修改的一个关于Factory模式的代码,在里面添加了一个派生类ConcreteProduct1

/****************Factory.h************************/
class Product
{
public:
virtual ~Product() = 0;
protected:
Product();
private:
};
class ConcreteProduct:public Product
{
public:
~ConcreteProduct();
ConcreteProduct();
protected:
private:
};

class ConcreteProduct1:public Product
{
public:
~ConcreteProduct1();
ConcreteProduct1();
protected:
private:
};

class Factory
{
public:
virtual ~Factory() = 0;
virtual Product* CreateProduct() = 0;
protected:
Factory();
private:
};
class ConcreteFactory:public Factory
{
public:
~ConcreteFactory();
ConcreteFactory();
Product* CreateProduct();
protected:
private:
};

class ConcreteFactory1:public Factory
{
public:
~ConcreteFactory1();
ConcreteFactory1();
Product* CreateProduct();
protected:
private:
};

/****************Factory.cpp************************/

#include "Factory.h"
#include <iostream>
using namespace std;
Product::Product()
{
}
Product::~Product()
{
}
ConcreteProduct::ConcreteProduct()
{
cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct()
{
}

ConcreteProduct1::ConcreteProduct1()
{
cout<<"ConcreteProduce1...."<<endl;
}

ConcreteProduct1::~ConcreteProduct1()
{

}

Factory::Factory()
{
}
Factory::~Factory()
{
}
ConcreteFactory::ConcreteFactory()
{
cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory()
{
}
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}

ConcreteFactory1::ConcreteFactory1()
{
cout<<"ConcreteFactory1....."<<endl;
}

ConcreteFactory1::~ConcreteFactory1()
{

}

Product* ConcreteFactory1::CreateProduct()
{
return new ConcreteProduct1();
}

/*****************test.cpp************************/

#include "Factory.h"

#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Factory* fac = new ConcreteFactory();
Product* p = fac->CreateProduct();

Factory* fac1 = new ConcreteFactory1();
Product* p1 = fac1->CreateProduct();
return 0;
}

程序输入为:
ConcreteFactory.....
ConcreteProduct....
ConcreteFactory1.....
ConcreteProduce1....
Press any key to continue
我的问题是:
Factory模型的提出就是为了解决下面的情况:
n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。这里带来两个问题1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了。),2)程序的扩展性和维护变得越来越困难。

但是现在通过上面的代码可以看出,虽然不用对派生类执行new操作了,但是必须对工厂的派生类分别进行new操作,也即上述测试程序中的:Factory* fac = new ConcreteFactory(); Factory* fac1 = new ConcreteFactory1();语句。这不是将问题转移了么?而没有从根本上解决问题?烦请大家给予指导,谢谢!!
...全文
评论 11
收藏 已收藏
分享
返回顶部
rabbit729
模式及实现 5,529 成员 4,167 内容