【发布时间】:2017-09-30 08:53:02
【问题描述】:
我正在学习新的设计模式,并试图了解简单工厂和工厂方法模式之间的区别。首先,我想明确一点,我尝试从 Stack-overflow 和其他网站上阅读很多关于相同内容的文章,但这对我没有帮助。
这是我的问题: 让我们考虑一下我有一个产品层次结构,如下所示:
我写了一个简单的工厂类,如下所示
public class SimpleItemFactory {
static Item getItem(String type) {
if(type.equals("Cake")) {
return new Cake();
}else if(type.equals("Chocolate")) {
return new Chocolate();
}else {
return null;
}
}
}
所以现在我在一个地方创建了所有对象,所以如果明天发生任何变化[像构造函数需要一个参数],我们只需要在一个地方进行更改。但它打破了 OPEN CLOSED 原则,就好像明天我们添加更多项目我们需要在条件下更改 getItem() 方法。所以我们选择工厂方法模式
我们创建Factory类如下图:
public abstract class ItemFactory {
abstract Item getItem();
}
class CakeFactory extends ItemFactory {
@Override
Item getItem() {
return new Cake();
}
}
class ChocolateFactory extends ItemFactory {
@Override
Item getItem() {
return new Chocolate();
}
}
class Client{
public static void main(String[] args) {
Item chocolate = new ChocolateFactory().getItem();
System.out.println(chocolate);
}
}
现在,当客户想要添加名为 IceCream 的新 Item 时,他们只需创建名为 IceCreamFactory 的新工厂并从中创建 IceCream,如下所示:
class IceCreamFactory extends ItemFactory{
@Override
Item getItem() {
return new IceCream();
}
}
class Client{
public static void main(String[] args) {
Item iceCream = new IceCreamFactory().getItem();
System.out.println(iceCream);
}
}
我的理解正确吗? 我们在这里满足了开放封闭原则,但是对于每个产品(Item)我们都需要一个工厂类,这不是可以管理的噩梦吗?
【问题讨论】:
-
简单工厂违反 OCP。如果你选择 Simple Factory,你最终会添加几十个 if-else(以最简单的形式),我认为这不是最佳实践。在这种情况下,我宁愿选择工厂方法
标签: java design-patterns factory-pattern software-design