我有两个类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();
}
}