java - 简单工厂和工厂方法设计模式的区别

标签 java design-patterns factory-pattern software-design

我正在学习新的设计模式,我正在尝试了解简单工厂模式和工厂方法模式之间的区别。首先,我想澄清一下,我尝试从 Stack-overflow 和其他网站阅读很多关于相同内容的文章,但这对我没有帮助。

这是我的问题: 让我们考虑一下我有一个产品层次结构,如下所示: enter image description here

我写了一个简单的工厂类,如下所示

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() 方法。所以我们选择工厂方法模式 enter image description here

我们创建如下所示的工厂类:

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 的新项目时,他们只需创建名为 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)我们都需要一个工厂类,这不会成为可管理的噩梦吗?

注意:我指的是文章 https://www.codeproject.com/Articles/1135918/Factory-Patterns-Factory-Method-Pattern?msg=5380215#xx5380215xx

最佳答案

其实你的理解是正确的,只是你需要注意每一个设计模式都是为了解决至少一个单一的问题,有时它可能会带来一些其他的复杂性副作用,这意味着没有完美的设计模式可以解决所有问题。

出于学习的目的,您一个一个地应用设计模式(这使得设计模式的真正力量同样是害羞或隐藏),但是在现实世界中,设计模式是混合在一起的(甚至您可以发明一个新的模式:p) 为了创造满足您的大部分需求并接近理想的东西,您可以遇到例如 Builder 模式与 Factory 模式的混合或 Factory 模式与 Strategy 模式的混合,甚至他们三个混合在一起......

对于您的情况,我建议例如将工厂方法模式简单工厂模式结合使用依赖注入(inject)模式来创建一些东西非常漂亮,同时满足打开关闭原则。

class ItemFactoryContainer() {

    private Map<String, ItemFactory> factories = new HashMap<>();

    public void register(String name, ItemFactory factory) {
        factories.put(name, factory);
    }

    public ItemFactory getFactory(String name) {
        return factories.get(name);
    }
}

public class ItemFactoryTest {

    public static void main(String...args) {

        ItemFactoryContainer factoryContainer = new ItemFactoryContainer();

        factoryContainer.register("choclate", new ChocolateFactory ());
        factoryContainer.register("cake", new CakeFactory ());
        factoryContainer.register("iceCream", new IceCreamFactory  ());

        Chocolate choclate = factoryContainer.getFactory("choclate").getItem();
        Cake cake = factoryContainer.getFactory("cake").getItem();
    }
}

关于java - 简单工厂和工厂方法设计模式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501200/

相关文章:

c# - 在单元测试时进行企业框架调用

Java工厂模式——动态加载类

c++ - 模板类的工厂模式和模板类的新类型默认参数

java - 二维数组不以矩阵格式打印值

java - 文件扫描器 : Unreported exception FileNotFoundException; must be caught or declared to be thrown

java - 发送 session

javascript - 是否可以编写这样的 JavaScript 日志类?

design-patterns - 用于多个生产者和多个消费者的 Redis pub sub

java - FragmentTransaction.commit 上的 Activity 已被销毁

c# - 防止几乎相同接口(interface)的代码重复