【问题标题】:Use of different classes based on a single value基于单个值使用不同的类
【发布时间】:2012-09-19 09:42:09
【问题描述】:

我正在开发一个应用程序,它应该基于一条信息使用不同的类类型。为了更好地说明我的问题,我举个例子:

假设INFO 是一个布尔值。根据它的值,我的代码必须使用某个类A 或某个类B 的实例。请注意,对于每个AB 都是它的子类。 INFO 在应用程序启动时设置,并且在整个应用程序生命周期中不会更改。

我的问题:实现这个的最佳方式是什么

以下是我提出的一些方法,但请随时提出其他建议:

1.带有方法的工厂类:

public static A getA(final boolean INFO) {
    return INFO ? new A() : new B();
}

2。包装类:

class WrapperForSomeClass {

    public final A instance;

    public WrapperForSomeClass(final boolean INFO) {
        instance = INFO ? new A() : new B();
    }

}

3。接口+工厂类:

public interface IWrappable<T> {
    T get(final boolean INFO);
}

private static final IWrappable<A> WRAPPER_FOR_A = new IWrappable<A>() {
    public A get(final boolean INFO) {
        return INFO ? new A() : new B();
    }
};

public static A getA(final boolean INFO) {
    return WRAPPER_FOR_A.get(INFO);
}

如果让我选择,我会选择 3 号。你说什么?

【问题讨论】:

    标签: java android design-patterns


    【解决方案1】:

    1 是最短和最干净的。将此方法放到A类中,以免创建多余的工厂类。

    为什么你会选择 3?它的作用相同,但代码更多。

    【讨论】:

    • 我选择选项 3 的原因是因为它给了我一种(错误的?)灵活性和通用性的感觉。至于将工厂方法放在A类中: 1 - 我无法访问源代码; 2 - 我有大约 20 种类似的方法要实现,我认为我最好使用工厂类,只是为了紧凑,如果不是为了其他任何东西。我想错了吗?
    • 如果无法访问源代码,那么工厂是唯一的选择。那么,由于 1 的接口与 3 的接口相同,因此可以安全地先实现 1,然后在真正需要时重构为 3。
    【解决方案2】:

    我会这样做:

    class A
    {
    }
    
    class B extends A
    {
    }
    
    class AFactory
    {
        public A getInstance(boolean info) 
        {
            return info ? new A() : new B();
        }
    }
    
    class MyMainLauncher
    {
        private AFactory aFactory;
        private A instance;
    
        {
            // has access to the boolean value `info`.
            instance = aFactory.getInstance(info);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2019-10-24
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多