gpt4 book ai didi

java - 工厂设计模式与OCP(开闭原则)的违反

转载 作者:行者123 更新时间:2023-12-01 11:51:37 26 4
gpt4 key购买 nike

工厂在this tutorial明显违反了OCP。每次在系统中添加一个形状时,我们都需要在工厂中添加它来支持它。
我正在考虑另一种实现,我想知道是否有任何缺点。

public class ShapeFactory {

//use getShape method to get object of type shape
public Shape getShape(Class<? extends Shape> shapeType){
return shapeType.newInstance();
}
}

这个实现看起来不违反OCP,也不复杂。有什么理由我找不到任何提到它的工厂设计模式教程?

最佳答案

这种方法有一些缺点。

首先,当传递给 getShape 的类需要构造函数参数时,.newInstance 将失败。例如:

public class Circle {
public Circle(int diameter) {
//something
}
}

您可以使用 getConstructor 进行反射(reflection)并找出要传递的参数,但这很复杂且容易出错。而且您在编译时失去了类型安全性。工厂类如何知道将什么值传递给直径?

工厂设计模式的优点之一是调用者在调用时不必知道使用了什么实现类。举个例子:
public class ShapeFactory {
public Shape getCircle(int diameter){
return new Circle(int diameter);
}
}

每当您调用此方法时,调用者都不需要对 Circle 类的依赖:
Shape s = ShapeFactory().getCircle(10);
s.draw();

这样,只有 ShapeFactory取决于 Circle .因此,当您更改或替换 Circle 类时,只有 ShapeFactory必须改变。

为了创建符合 OCP 的 shape 程序,我们可以将 ShapeFactory 替换为依赖注入(inject)框架。下面的代码是伪代码,显示了它是如何工作的
// define the classes
class Circle {}
class Square {}

// for every class, provide a factory method. These do not have to exist inside a factory class.
public Circle createCircle() {
return new Circle(10)
}

public Circle createSquare() {
return new Square(42, 5)
}


public class Painter {
//when a class requires an instance of the Circle class, the dependency injection framework will find `createCircle`, call it and add the result as an argument here.
public Painter(Circle circle) {
circle.draw();
}
}


//when you need a painter object, we don't create it yourself but let the dependency framework do the heavy lifting
Painter p = dependencyframework.getInstanceOf(Painter.class)

有许多 Java 依赖注入(inject)框架,但它们都是这样工作的。

这些框架与您建议的完全相同(例如 newInstancegetConstructor ,但还有很多),它们只是隐藏了所有反射复杂性。

关于java - 工厂设计模式与OCP(开闭原则)的违反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com