简略工厂模式VS工厂模式,想问问工厂模式有啥用
简单工厂模式VS工厂模式,想问问工厂模式有啥用?
最近在看设计模式。
前提:
class A
{
};
class B : public A
{
};
class C : public A
{
};
int main()
{
A* b = new B();
A* c = new C();
return 0;
}
简单工厂:
class Factory
{
A* a;
A* function(std::string key)
{
switch(key)
{
case "b":
a = new b();
break;
case "c":
a = new c();
break;
}
return a;
}
};
简单工厂模式,会有一个方法,通过传进来的参数判断new哪一个子类对象,然后返回给使用者,那么【这个动态生成对象的判断就在工厂类中处理,使用者不需要做逻辑处理,只需传进参数即可获得对应的对象】
工厂模式:
class Bfactory : public B
{
A* b;
A* function()
{
b = new B();
return b;
}
};
class Cfactory : public C
{
};
结果是对应每个子类,都有一个对应的工厂类【里面有一个方法产生其对象】。
问题就在于这里了,工厂模式最终还是交给使用者进行逻辑判断,究竟使用那个工厂类。那么不就没有了简单工厂模式的优势了??再者一个子类对应一个工厂类,由工厂类产生子类对象。还不如直接用子类产生对象就行了,工厂类还有何用?
PS:
1普通生成子类: A* b = new B();
2工厂模式生成子类: Bfactory* pFactory = new Bfactory(); A* b = pFactory->function();
既然都是由使用者做逻辑判断产生哪个子类,由何须工厂模式再弄多一个工厂类出来呢?
希望各位大虾指导一下,刚看设计模式。。。。
------解决方案--------------------
有的东西是文字无法表达的,扩展性是什么?重用性是什么?易于修改到底是什么意思,这些你可以想想,似乎懂了,似乎不懂,其实有的东西当你亲身去体会你才知道他们真正的含义。建议楼主搜一下面向接口编程
------解决方案--------------------
你说的工厂模式应该是一种”工厂方法“模式。工厂方法提供了所谓的“虚构造函数”功能,c++的ctor是不能为virtual的,但在某些场合下,开发者却需要这样的多态性。“工厂方法”就是解决这个问题的,你在你的开发中肯定没有遇到过这样的需求,因此你就不会有这样的考虑。一个工厂方法具有这样的形式:
class A
{
public:
virtual ~A() {}
};
class AFactory
{
public:
virtual A* create() { return new A; }
};
这个具体建立对象的方法一定是virtual的。Factory就充当了一个虚构造函数的功能。假设我有一个应用基类,它需要构建一个A的子类来完成某些事情:
class App
{
public:
App( AFactory& f ) { a = f.create(); }
protected:
A* a;
};
我会这么使用它们:
AFactory f;
App app( &f );
但是我现在需要扩展App以及A的功能:
class A2 : public A {}
class App2 : public App
{
public:
App( AFactory& f ) { a = f.create(); }
}
我的App2在App的基础上增加了一些新的内部操作,并且在App2中使用的是A2——A的子类,因为在内部都是基于接口进行开发的,因此一切都靠多态性保持兼容。在App2我需要构造A2,而不是A,我还要保持接口一致,怎么做呢?这就是工厂方法的威力所在,我子类化AFactory:
class A2Factory : public AFactory
{
public:
virtual A* create() { return new A2; }
};
然后,我这样使用它们:
A2Factory f;
最近在看设计模式。
前提:
class A
{
};
class B : public A
{
};
class C : public A
{
};
int main()
{
A* b = new B();
A* c = new C();
return 0;
}
简单工厂:
class Factory
{
A* a;
A* function(std::string key)
{
switch(key)
{
case "b":
a = new b();
break;
case "c":
a = new c();
break;
}
return a;
}
};
简单工厂模式,会有一个方法,通过传进来的参数判断new哪一个子类对象,然后返回给使用者,那么【这个动态生成对象的判断就在工厂类中处理,使用者不需要做逻辑处理,只需传进参数即可获得对应的对象】
工厂模式:
class Bfactory : public B
{
A* b;
A* function()
{
b = new B();
return b;
}
};
class Cfactory : public C
{
};
结果是对应每个子类,都有一个对应的工厂类【里面有一个方法产生其对象】。
问题就在于这里了,工厂模式最终还是交给使用者进行逻辑判断,究竟使用那个工厂类。那么不就没有了简单工厂模式的优势了??再者一个子类对应一个工厂类,由工厂类产生子类对象。还不如直接用子类产生对象就行了,工厂类还有何用?
PS:
1普通生成子类: A* b = new B();
2工厂模式生成子类: Bfactory* pFactory = new Bfactory(); A* b = pFactory->function();
既然都是由使用者做逻辑判断产生哪个子类,由何须工厂模式再弄多一个工厂类出来呢?
希望各位大虾指导一下,刚看设计模式。。。。
------解决方案--------------------
有的东西是文字无法表达的,扩展性是什么?重用性是什么?易于修改到底是什么意思,这些你可以想想,似乎懂了,似乎不懂,其实有的东西当你亲身去体会你才知道他们真正的含义。建议楼主搜一下面向接口编程
------解决方案--------------------
你说的工厂模式应该是一种”工厂方法“模式。工厂方法提供了所谓的“虚构造函数”功能,c++的ctor是不能为virtual的,但在某些场合下,开发者却需要这样的多态性。“工厂方法”就是解决这个问题的,你在你的开发中肯定没有遇到过这样的需求,因此你就不会有这样的考虑。一个工厂方法具有这样的形式:
class A
{
public:
virtual ~A() {}
};
class AFactory
{
public:
virtual A* create() { return new A; }
};
这个具体建立对象的方法一定是virtual的。Factory就充当了一个虚构造函数的功能。假设我有一个应用基类,它需要构建一个A的子类来完成某些事情:
class App
{
public:
App( AFactory& f ) { a = f.create(); }
protected:
A* a;
};
我会这么使用它们:
AFactory f;
App app( &f );
但是我现在需要扩展App以及A的功能:
class A2 : public A {}
class App2 : public App
{
public:
App( AFactory& f ) { a = f.create(); }
}
我的App2在App的基础上增加了一些新的内部操作,并且在App2中使用的是A2——A的子类,因为在内部都是基于接口进行开发的,因此一切都靠多态性保持兼容。在App2我需要构造A2,而不是A,我还要保持接口一致,怎么做呢?这就是工厂方法的威力所在,我子类化AFactory:
class A2Factory : public AFactory
{
public:
virtual A* create() { return new A2; }
};
然后,我这样使用它们:
A2Factory f;