我有两个类CashStore和DrinkStore,它们都从Store扩展。我有一个StoreFactory类(返回Store对象)来为客户端实例化对象。我想从这些客户端访问特定于子类的方法。我如何在不铸造的情况下做到这一点?如果我使用强制转换,是否会破坏模式,因为现在客户知道了Child类?

class Store{
    A(){}
    B(){}
}

class CashStore{
    A(){}
    B(){}
    C(){}
    D(){}
}

//impl for drink store and other stores

class StoreFactory{
    public Store getStore(String type){
        //return a Store obj based on type DrinkStore or CashStore
    }
}


class Client{
    StoreFactory fac;

    public Client(){
        fac = new StoreFactory();
        Store s = fac.getStore("cash");
        s.C(); //requires a cast
    }
}


铸造会破坏我的模式吗?

最佳答案

工厂模式用于与运行时类型分离。例如,当它是特定于平台或布局的,并且您不希望您的客户端代码弄乱它时。在您的情况下,您确实需要一个确切的类型,因此似乎工厂模式不是一个好的选择。考虑使用简单的静态方法,例如:

class Stores {
  static CashStore createCashStore() {
    return new CashStore();
  }
  static DrinkStore createDrinkStore() {
    return new DrinkStore();
  }
}

10-05 18:53