使用工厂方法创建子类对象

Posted

技术标签:

【中文标题】使用工厂方法创建子类对象【英文标题】:Create subclass object with factory method 【发布时间】:2014-02-24 16:08:46 【问题描述】:

有一个我无法控制的 Gold 类。它有一个工厂方法:

public static Gold TransmuteFromLead(Lead someLead);

我现在将 Gold 子类化为我自己的 GoldWatch 类。我有一个 Lead 对象。有没有办法在 GoldWatch 中编写一个 TransmuteFromLead 方法,它以某种方式使用 Gold 的 TransmuteFromLead 方法但生成一个 GoldWatch 对象?

对于类似但不完全一样的问题,请参阅What's the correct alternative to static method inheritance? 但我的情况不同,因为我不控制基类。

【问题讨论】:

如果您在 GoldWatch 上有一个 GoldWatch CreateWatch(Gold someGold) 方法,您可以创建黄金然后创建手表。我想不出直接创建它的好方法。 尽管它偶尔会派上用场,但没有简单的方法。您必须手动从LeadGold 创建转换。如果您还需要复制一些私有字段,这很可能是不可能的(以一种干净的方式)。核心问题是,尽管GoldGoldWatch 之间共享了一些数据,但它们最终是两个不同的对象。像他们的内存组织这样的东西是 JIT 编译器的一个实现细节,所以真的没有什么可参考的。如果你真的需要这样做,你可能不得不使用反射,它仍然会很棘手。 【参考方案1】:

您可以使用隐式运算符:

public static implicit operator GoldWatch(Gold g)

    return new GoldWatch(g);

然后在GoldWatch 上添加一个构造函数以从Gold 对象初始化自身。

这将允许您这样做:

var goldWatch = (GoldWatch)TransmuteFromLead(someLead);

甚至这个:

GoldWatch goldWatch = TransmuteFromLead(someLead);

【讨论】:

【参考方案2】:

对于 Gold 中的任何其他公共方法,您将它们包装在 GoldWatch 中,然后在 gold 实例上调用相同的方法。

class GoldWatch : Gold 
    Gold gold;

    private GoldWatch(Gold gold) 
        this.gold = gold;
    

    GoldWatch TransmuteFromLead(Lead someLead) 
        return new GoldWatch(Gold.TransmuteFromLead(someLead));
    

【讨论】:

以上是关于使用工厂方法创建子类对象的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式——工厂方法模式对象创建

工厂方法模式

Java工厂方法模式

抽象工厂模式firstones

3 工厂方法模式

工厂模式