Подтвердить что ты не робот

Примеры factory методы Vs Static factory

Могут ли не все методы factory быть статическими? Требуется ли что-то, что производит продукт? Когда подходит для экземпляра factory или статического метода factory? Можете ли вы представить мне примеры, отличающие эти два?

4b9b3361

Ответ 1

Предполагая, что методом "instance factory" вы действительно говорите о методе GoF "factory", термин "статический метод factory" описан Джошуа Блох в его книге "Эффективная Java". Гуглинг вокруг я достиг на этих сайтах:

Надеюсь, что это помогло немного изменить ситуацию.

Следуя совету Марво:

  • Factory Метод, как указано в GoF: "Определите интерфейс для создания объекта, но пусть подклассы решают, какой класс должен быть создан. factory Метод позволяет кластеру отложить экземпляр к подклассам". Пример (код Java):

    public abstract class Product { ... }
    
    public class ConcreteProduct extends Product { ... }
    
    public abstract class Creator {
      public void anOperation() { ... product = factoryMethod(); ... }
      public abstract Product factoryMethod();
    }
    
    public class ConcreteCreator extends Creator {
      public Product factoryMethod() { return new ConcreteProduct(); }
    }
    
  • Статический factory Метод, как указано в Эффективной Java: "Класс может предоставлять общедоступный статический метод factory, который является просто статическим методом, возвращающим экземпляр класса. (...) Преимущество статических методов factory заключается в том, что в отличие от конструкторов у них есть имена. (...) Второе преимущество статических методов factory заключается в том, что в отличие от конструкторов им не требуется создавать новый объект каждый раз при вызове theyre. (...) Третьим преимуществом статических методов factory является то, что в отличие от конструкторов они могут возвращать объект любого подтипа возвращаемого типа. (...) Основной недостаток предоставления только статических factory методов что классы без публичных или защищенных конструкторов нельзя подклассифицировать". Пример (код Java):

    public class Boolean {
      ...
      public static Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
      }
      ...
    }
    

Ответ 2

Мое предпочтение заключается в том, чтобы сделать методы factory не статичными для упрощения тестирования. Вы не можете изменить статический вызов метода factory во время выполнения, тогда как если бы я мог предоставить реализацию factory объекту, тогда я мог бы проверить его более тщательно, поскольку я больше контролирую граф и контекст.

Ответ 3

Если вы возвращаете Singleton из вашего factory, тогда вам понадобится убедиться, что у вас есть только один экземпляр, если вы собираетесь создавать новый экземпляр каждый раз, когда вы вызываете factory, тогда сделайте его статическим.

Ответ 4

Это зависит, например, вы можете иметь factory, который будет производить только определенное количество объектов, и в этом случае будет соответствующее состояние. По большей части методы factory могут быть статическими, если они не полагаются на любые нестатические переменные (такие как нестатические глобальные и т.д.) Для их создания. Он также имеет тенденцию дифференцировать разные фабрики для разных частей приложения, поэтому в зависимости от того, есть ли в вашем factory состояние или нет, это то, что вы поделитесь с ним, не установленным в камне, что все методы factory должны быть статическими, проверьте какая ситуация относится к вам и правильно ее написала.

Еще одно соображение - ключевое слово static, это приводит к тому, что статический экземпляр создается только один раз в памяти, но недостатком является то, что он всегда находится в памяти процесса (что увеличивает размер рабочего набора). Это может быть то, чего вы не хотите, поскольку ваш factory может иметь очень высокую локальность в определенных областях, и в противном случае он просто будет использовать память в другом месте, но это, как правило, проблема оптимизации, на которую следует смотреть, только если проблема давления памяти в вашем приложении.