据我所知,Factory Method比Simple Factory的主要优点之一是它不违反Open-Closed SOLID原则.也就是说,前者不需要在添加新类型时修改switch语句.
有一件我希望得到澄清.如果我要使用一个简单的工厂,我会有一个像这样的工厂(简化):
public class ObjectFactory {
public static IObject CreateObject(ObjectTypeEnum objectType) {
switch (objectType) {
case TypeA:
return ObjectA;
break;
case TypeB:
return ObjectB;
break;
case TypeC:
return ObjectC;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且客户端会这样称呼它:
IObject myObject = ObjectFactory.CreateObject(objectType);
Run Code Online (Sandbox Code Playgroud)
文献中的缺点是在添加新对象类型时需要修改CreateObject.
但是使用Factory方法,我们不会将此修改从工厂移动到客户端,就像这样(客户端代码):
IObject myObject;
switch (objectType) {
case TypeA:
myObject = ObjectAFactory.CreateObject();
break;
case TypeB:
myObject = ObjectBFactory.CreateObject();
break;
case TypeC:
myObject = ObjectCFactory.CreateObject();
break;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每次添加新类型时都需要修改客户端,而在之前的情况下需要修改工厂.那么一个优于另一个的优势是什么?请不要将此标记为重复,我已经查看了很多关于工厂的SO帖子,没有一个解决这个特定的区别.
是否有更好的解决方案不会违反客户或工厂方面的开放/封闭原则?
design-patterns factory factory-pattern open-closed-principle solid-principles
我对“与工厂相关的”设计模式及其OOP实现的理解一直很简单。
但是我最近偶然发现了有关该主题的Wikipeda文章(Factory,Abstract factory),这使我有些困惑,尤其是关于OOP中的“ Factory”是什么。
这里有几个引号:
- 在工厂方法或工厂功能中,返回“新”对象的子例程可以称为“工厂”。
- 工厂用于各种设计模式
- “抽象工厂模式”是一种建立工厂集合的方法。
- 工厂是代码中具体类的位置,在该类中构造对象
引起一些问题:
(1)&(2)这是否意味着工厂不是类或对象,而是逻辑?
(2)“工厂”本身不是模式吗?
(3)“收藏”在这里是什么意思?只是说“您可以有多个实现相同接口的工厂(这是一个抽象工厂)”的一种方式吗?
(4)什么?
任何人都可以澄清这意味着什么吗?我对工厂的最初理解不正确吗?
我试图理解抽象工厂模式,这是我的第一个近似值:
#include <iostream>
using namespace std;
class Soldier
{
public:
virtual void shoot()=0;
};
class Archer: public Soldier
{
public:
void shoot(){
cout<<"Archer shoot"<<endl;
}
};
class Rider: public Soldier
{
public:
void shoot(){
cout<<"Rider shoot"<<endl;
}
};
class AbstractFactory
{
public:
virtual Soldier* createArcher()=0;
virtual Soldier* createRider()=0;
};
class OrcFactory: public AbstractFactory
{
Soldier* createArcher()
{
return new Archer();
};
Soldier* createRider()
{
return new Rider();
};
};
class HumanFactory: public AbstractFactory
{
Soldier* createArcher()
{
return new Archer(); …Run Code Online (Sandbox Code Playgroud) 工厂模式违反了 OCP 原则,因为它使用if()语句,这意味着如果添加任何类,则工厂类必须更改,这违反了 SOLID 原则。自注册类应该根据以下资源解决此问题:http://www.jkfill.com/2010/12/29/self-registering-factories-in-c-sharp/。问题是我不懂C#。有人可以用 Java 举一个例子吗?提前致谢。
public class ShapeFactory {
//The purpose of self registering classes is to avoid if's
public Shape getShape(String shapeType){
if(shapeType == null){ //Get rid of this
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)