java - 抽象工厂设计: Replacing if else with enum

标签 java design-patterns abstract-factory

当我们使用抽象工厂模式时,我们通常有FactoryMaker类,它有一个getFactory函数,我们在其中传递参数,并且我们在函数中对传递的参数有switchif-else逻辑来决定返回哪个工厂。创建传递的参数为枚举或对象,然后在这些对象中返回哪个工厂的逻辑会更好。例如:

让我们说我们的工厂制造商通过枚举 CountryCode 来决定工厂。


    public class FacoryMaker {

        public final static FacoryMaker fctry= new FacoryMaker();

        public static RetailFactory getFactory(CountryCode code){
            RetailFactory rt = null;
            if(code == CountryCode.UK){
                rt = new UKFactory();
            }
            if(code == CountryCode.US){
                rt = new USFactory();
            }
            return rt;
        }
    }

我们将取而代之的是:


    public class FacoryMaker {

        public final static FacoryMaker fctry= new FacoryMaker();

        public static RetailFactory getFactory(CountryCode code){
            return code.getFactory();
        }
    }

枚举将被修改如下:


    public enum CountryCode {
        US(){
            @Override
            public RetailFactory getFactory() {
                return new USFactory();
            }
        },  
        UK(){
            @Override
            public RetailFactory getFactory() {
                return new UKFactory();
            }
        };  
        public abstract RetailFactory getFactory();
    }

但我认为这一点并未得到普遍遵循。为什么会这样呢?为什么我们不能让传递的参数始终是一个对象,并且将逻辑放在哪个工厂的对象中来获取?在任何抽象工厂设计下它都会失败吗?对我来说它看起来很普通。此外,甚至可以删除工厂制造商并直接使用该对象来获取工厂实例。

最佳答案

在设计软件时,需要考虑的一个方面是关注点分离,对我来说让 CountryCode 创建 RetailFactory 听起来不太合理。这两个概念彼此之间的内聚力相当低,应该避免这种情况。

此外,如果您已经有了国家/地区代码,为什么还需要工厂,是什么阻止您直接调用 getFactory 方法?这根本没有任何意义。

CountryCode 只是 FactoryMaker 的 getFactory 方法的提示,即如何创建工厂。它甚至可能完全忽略国家代码。如果某个国家没有 RetailFactory 怎么办?你返回null吗? DefaultFactory 还是其他国家的工厂?

当然可以这样做,但是如果您半年后查看您的代码,您可能会想“Wtf?为什么我要在国家/地区代码中创建工厂?!

此外,您提供的第一个示例似乎更像是工厂方法而不是工厂,因为根本没有使用FactoryMaker。

关于java - 抽象工厂设计: Replacing if else with enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088314/

相关文章:

java - 为什么Android中不保留Intent

c++ - 是否有一个类存储另一个类所需信息的设计模式,例如它的构造?

Ruby DSL 嵌套结构

c# - 具有通用功能的方法的工厂模式

java - 如何将接受 Class<T> 并生成 T 的工厂方法集成到 Spring 中

java - 运行 sbt 返回错误 : '-java-home requires <path> argument'

java - Google App Engine,Java 数据存储区查询 : How to do SQL Like Statement?

java - 当我尝试打开任何东西时,Android Studio 卡住/挂起

php - "Proper"index.php 和前端 Controller 的分离/区别

.net - codecampserver 中的 StaticFactory<T> 是众所周知的模式吗?