【问题标题】:Design pattern for creating an object from another object in different ways以不同方式从另一个对象创建对象的设计模式
【发布时间】:2011-05-10 17:49:12
【问题描述】:

我必须以 4-5 种不同的方式使用对象 Y 的属性(两者都属于同一类型)创建对象 X,即根据情况,Y 的这些属性可以用于以不同方式初始化 X。一种方法是,使用默认构造函数创建一个对象 X,然后设置它的属性,但它有一个缺点,如果出现问题,那么我们的对象处于不一致的状态。另一种方法是为所有具有虚拟参数的情况创建不同的构造函数,这听起来很糟糕。 我可以在这里使用任何好的设计模式吗?

【问题讨论】:

    标签: java design-patterns constructor


    【解决方案1】:

    如果两个对象属于同一类型,则可以使用工厂方法:

    public class Foo {
        ...
        public Foo withBar(...) {
            Foo f = new Foo(this.param);
            f.setBar(...);
            return f;
        }
    
        public Foo withBaz(...) {
            Foo f = new Foo(this.param);
            f.setBaz(...);
            return f;
        }
    }
    ...
    Foo y = ...;
    Foo x = y.withBar(...);
    

    如果类型不同,可以将工厂方法设为静态,并将 Y 作为参数传递。

    【讨论】:

    • 将 Y(不同类型)作为参数传递给 X 的构造函数是一种好习惯吗?等等,public Foo(Bar y) { ... }
    【解决方案2】:

    听起来您可以使用Factory Pattern 的稍微专业化的版本。例如。构建对象的一部分可能是传入现有实例(或实例的接口)以初始化新对象。

    【讨论】:

    • +1 额外使用“工厂方法”将满足这种情况
    • @user625146:同意。我提出了 Pattern 而不是方法,因为我认为它可能有助于 kcr 的架构。
    • 在工厂模式中,何时将它们用作静态,何时不使用?
    • 工厂方法并不真正适合静态类的使用。它们更多地是关于实例。我认为在您的情况下,您正在使用具有不同状态的多个对象,我建议您不要尝试对静态成员进行任何操作。
    【解决方案3】:

    可以在here找到很好的工厂模式解释。
    此外,Joshua Bloch 在他的《Effective Java》一书中提出了使用静态工厂的一些好处

    【讨论】:

      【解决方案4】:

      这听起来像是Abstract Factory 模式的一个案例。

      【讨论】:

        【解决方案5】:

        除了工厂模式,看看Builder Pattern。此模式允许客户端配置对象的构造方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多