Я думал, что добавлю немного света в этот пост о том, что я знаю. Мы широко использовали эту технику в нашем recent android project
. Вместо creating objects using new operator
вы также можете использовать static method
для создания экземпляра класса. Список кодов:
//instantiating a class using constructor
Vinoth vin = new Vinoth();
//instantiating the class using static method
Class Vinoth{
private Vinoth(){
}
// factory method to instantiate the class
public static Vinoth getInstance(){
if(someCondition)
return new Vinoth();
}
}
Статические методы поддерживают создание условных объектов : Каждый раз, когда вы вызываете конструктор, объект создается, но вы, возможно, этого не хотите. Предположим, вы хотите проверить какое-то условие только тогда, когда захотите создать новый объект. Вы не будете создавать новый экземпляр Vinoth каждый раз, если ваше условие не будет выполнено.
Другой пример взят из Effective Java .
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Этот метод переводит логическое примитивное значение в ссылку на логический объект. Метод Boolean.valueOf(boolean)
иллюстрирует нас, он никогда не создает объект. Способность static factory methods
возвращать один и тот же объект из повторяющегося invocations
позволяет классам сохранять строгий контроль над тем, какие экземпляры существуют в любое время.
Static factory methods
заключается в том, что, в отличие от constructors
, они могут возвращать object
любого subtype
своего типа возврата. Одним из применений этой гибкости является то, что API может возвращать объекты, не делая их классы общедоступными. Сокрытие классов реализации таким способом приводит к очень компактному API.
Calendar.getInstance () является отличным примером для вышеупомянутого, он создает в зависимости от локали BuddhistCalendar
, JapaneseImperialCalendar
или по умолчанию один Georgian
.
Другой пример, о котором я мог бы подумать, это Singleton pattern
, где вы делаете свои конструкторы приватными, создаете собственный метод getInstance
, где вы убедитесь, что всегда доступен только один экземпляр.
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}