2016-11-11 3 views
1

Я ищу улучшенное решение следующей проблемы. У меня есть объект, который передается на завод; фабрика проверит тип объекта, создаст другой тип, который он заполняет данными из входящего объекта и возвращает новый.Устранение экземпляра в заводском методе

... 

public MyAbstractClass create(MyObject a) { 

    if (a instanceof A) { 
     A obj = (A) a; 
     return new MyAbstractClass_1 (obj.getField(), factoryField); 
    } 
    else if (a instanceof B) { 
     B obj = (B) a; 
     return new MyAbstractClass_2 (obj.getSomething(), obj.getSomethingElse(), factoryField); 
    } 

} 

Экземпляры типа возврата обрабатываются в общих чертах послесловия. В будущем мне нужно поддерживать больше типов, и, если возможно, я бы хотел избежать решения instanceof. Как я могу улучшить это?

ответ

2

Можете ли вы добавить метод create в MyObject вместо этого? Таким образом, вам больше не понадобится экземпляр, потому что каждый экземпляр MyObject знает, как «создавать». Вы не будете иметь фабрику больше, хотя :(

Это будет выглядеть примерно так (при условии, MyObject является интерфейсом, если это класс, то просто расширить вместо этого.):

interface MyObject { 
    ... 
    public MyAbstractClass create(MyObject a); 
    ... 
} 

public class A implements MyObject { 
    ... 
    public MyAbstractClass create(MyObject a) { 
    return new MyAbstractClass_1 (obj.getField(), factoryField); 
    } 
    ... 
} 

public class B implements MyObject { 
    ... 
    public MyAbstractClass create(MyObject a) { 
    return new MyAbstractClass_2 (
     obj.getSomething(), 
     obj.getSomethingElse(), 
     factoryField); 
    } 
    ... 
} 
0

Тела ваши if заявления должны быть виртуальными или абстрактными членами на MyObject.

abstract class MyObject { 
    public abstract MyAbstractClass create(); 
} 

class A extends MyObject { 
    @Override 
    public MyAbstractClass create(Object factoryField) { 
     return new MyAbstractClass_1 (this.getField(), factoryField); 
    } 
} 

class B extends MyObject { 
    @Override 
    public MyAbstractClass create(Object factoryField) { 
     return new MyAbstractClass_2 (this.getSomething(), this.getSomethingElse(), factoryField); 
    } 
} 

Вообще, когда вы видите себя проверку типа объекта, чтобы сделать что-то другое в зависимости от конкретного типа, что, вероятно, означает, что вы должны быть ны g, и код должен входить в конкретные типы.

Обновлено, что данные MyObject должны поступать из текущего экземпляра и не передаваться в качестве параметра, как вы указали. Только проблема в том, что я не уверен, где вы сейчас положили factoryField. Вы можете передать это как параметр, как указано выше, и поскольку это виртуальные участники, вы все равно можете иметь завод:

class SomeFactory { 
    private Object factoryField; 

    public SomeFactory(Object factoryField) { 
     this.factoryField = factoryField; 
    } 

    public MyAbstractClass create(MyObject a) { 
     return a.create(factoryField); 
    } 
} 
+0

В чем причина того, что метод 'create' принимает какие-либо аргументы? Реализация имеет то, что нужно для создания объекта - за исключением 'factoryField'. – user1491636

+0

@ user1491636 Вы правы, эта информация должна поступать из экземпляра сейчас –

+0

Вы обновленное решение - это то, о чем я думал ... не уверен, что это действительно фабрика, хотя :) – user1491636

Смежные вопросы