Разница между методами записи / статическими функциями с классами ES6 [duplicate]

Я столкнулся с этим сегодня, с модальным position: fixed, который я использовал повторно. Я не смог сохранить его display: none, а затем оживить его, поскольку он просто вскочил на внешний вид, а также z-index (отрицательные значения и т. Д.) Тоже сделали странные вещи.

Я также использовал height: 0 до height: 100%, но он работал только тогда, когда появился модальный. Это то же самое, что если вы использовали left: -100% или что-то в этом роде.

Тогда мне показалось, что был простой ответ. Et voila:

Во-первых, ваш скрытый модальный. Обратите внимание, что height есть 0, и проверьте декларацию height в переходах ... у него есть 500ms, , который длиннее моего opacity перехода . Помните, что это влияет на переход к постепенному исчезновению: возвращение модального состояния в состояние по умолчанию.

#modal-overlay {
    background: #999;
    background: rgba(33,33,33,.2);
    display: block;
    overflow: hidden;
    height: 0;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    z-index: 1;
    -webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
       -moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
            -ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
         -o-transition: height 0s 500ms, opacity 300ms ease-in-out;
        transition: height 0s 500ms, opacity 300ms ease-in-out;
}

Во-вторых, ваш видимый модальный. Предположим, вы устанавливаете .modal-active на body. Теперь height - 100%, и мой переход также изменился. Я хочу, чтобы height был немедленно изменен, а opacity - 300ms.

.modal-active #modal-overlay {
    height: 100%;
    opacity: 1;
    z-index: 90000;
    -webkit-transition: height 0s, opacity 300ms ease-in-out;
       -moz-transition: height 0s, opacity 300ms ease-in-out;
        -ms-transition: height 0s, opacity 300ms ease-in-out;
         -o-transition: height 0s, opacity 300ms ease-in-out;
            transition: height 0s, opacity 300ms ease-in-out;
}

Вот и все, это работает как прелесть.

141
задан Hannele 27 November 2015 в 18:06
поделиться

9 ответов

Из стр. 108 из Шаблоны проектирования: Элементы многоразового объектно-ориентированного программного обеспечения Гамма, Шлем, Джонсон и Влиссидес.

Используйте шаблон Factory Method, когда

  • класс не может предвидеть класс объектов, которые он должен создать
  • , класс хочет, чтобы его подклассы указывали объекты, которые он создает.
  • классы делегируют ответственность одному из нескольких вспомогательных подклассов, и вы хотите локализовать знание того, какой вспомогательный подкласс является делегатом
60
ответ дан reevesy 26 August 2018 в 00:29
поделиться

Вы должны прочитать (если у вас есть доступ) Эффективный Java 2 Пункт 1: Рассмотрите статические заводские методы вместо конструкторов.

Преимущества статических заводских методов:

  1. У них есть имена.
  2. Они не обязаны создавать новый объект при каждом вызове.
  3. Они могут возвращать объект любого подтипа своего возвращаемый тип.
  4. Они уменьшают многословие создания экземпляров с параметризованным типом.

Недостатки статических заводских методов:

  1. При предоставлении только статической фабрики методы, классы без публичных или защищенных конструкторов не могут быть подклассы.
  2. Они не могут быть легко различимы с другими статическими методами
57
ответ дан cherouvim 26 August 2018 в 00:29
поделиться

Спросите себя, кто они и почему у нас есть. Они оба существуют, чтобы создать экземпляр объекта.

ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside

Пока нет разницы. Теперь представьте, что у нас есть разные типы школ, и мы хотим перейти от использования ElementarySchool к HighSchool (который получен из ElementarySchool или реализует тот же интерфейс ISchool, что и ElementarySchool). Изменение кода было бы:

HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside

В случае интерфейса у нас было бы:

ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside

Теперь, если у вас есть этот код в нескольких местах, вы можете видеть, что использование фабрики метод может быть довольно дешевым, поскольку после того, как вы измените заводский метод, который вы сделали (если мы используем второй пример с интерфейсами).

И это основное отличие и преимущество. Когда вы начинаете работать с сложными иерархиями классов и хотите динамически создавать экземпляр класса из такой иерархии, вы получаете следующий код. Затем фабричные методы могут принимать параметр, который сообщает методу, какой конкретный экземпляр должен быть создан. Предположим, у вас есть класс MyStudent, и вам нужно создать экземпляр соответствующего объекта ISchool, чтобы ваш ученик был членом этой школы.

ISchool school = SchoolFactory.ConstructForStudent(myStudent);

Теперь у вас есть одно место в вашем приложении, которое содержит бизнес-логику, которая определяет, какой объект ISchool создается для разных объектов IStudent.

Итак - для простых классов (объекты значений, и т. д.) конструктор просто прекрасен (вы не хотите перенастраивать свое приложение), но для сложных классов иерархии предпочтительным является заводский метод.

Таким образом, вы следуете первому принципу дизайна из группы из четырех книг «Программа на интерфейс, а не на реализацию».

160
ответ дан David Pokluda 26 August 2018 в 00:29
поделиться

Цитата из «Эффективной Java», 2-е изд., пункт 1: Рассмотрите статические заводские методы вместо конструкторов, p. 5:

«Обратите внимание, что статический заводский метод не совпадает с шаблоном Factory Method из шаблонов проектирования [Gamma95, стр. 107]. Статический заводский метод, описанный в этом элементе, не имеет прямого эквивалента в Design Узоры ".

11
ответ дан Eugen Labun 26 August 2018 в 00:29
поделиться

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

Разница между конструкторами и фабриками аналогична , скажем, переменную и указатель на переменную. Существует еще один уровень косвенности, что является недостатком; но есть еще один уровень гибкости, что является преимуществом. Поэтому, делая выбор, вам было бы полезно провести анализ затрат и выгод.

23
ответ дан Frederick The Fool 26 August 2018 в 00:29
поделиться

Используйте фабрику только тогда, когда вам необходим дополнительный контроль с созданием объекта, что невозможно сделать с конструкторами.

У фабрик есть возможность кэширования, например.

Другой способ использования заводов - это сценарий, в котором вы не знаете тип, который хотите построить. Часто вы видите этот тип использования в сценариях фабрики плагинов, где каждый плагин должен получить базовый класс или реализовать какой-то интерфейс. Завод создает экземпляры классов, которые производятся из базового класса или реализуют интерфейс.

11
ответ дан Hannele 26 August 2018 в 00:29
поделиться
3
ответ дан Lightman 26 August 2018 в 00:29
поделиться

Иногда вам приходится проверять / вычислять некоторые значения / условия при создании объекта. И если он может выбросить исключение - constructro очень плохой способ. Поэтому вам нужно сделать что-то вроде этого:

var value = new Instance(1, 2).init()
public function init() {
    try {
        doSome()
    }
    catch (e) {
        soAnotherSome()
    }
}

Где все дополнительные вычисления находятся в init (). Но только вы, как разработчик, знаете об этом init (). И, конечно, после нескольких месяцев вы просто забыли об этом. Но если у вас есть фабрика - просто сделайте все, что вам нужно, одним способом, сокрыв этот init () от прямого вызова - поэтому проблем нет. При таком подходе нет проблем с падением на создание и утечкой памяти.

Кто-то рассказал вам о кешировании. Хорошо. Но вы также должны помнить о шаблоне Flyweight, который приятно использовать с фабричным способом.

0
ответ дан R1K0 26 August 2018 в 00:29
поделиться

Конкретный пример из приложения CAD / CAM.

Путь резания будет выполняться с помощью конструктора. Это серия линий и дуг, определяющих путь к разрезанию. Хотя ряд строк и дуг может быть разным и иметь разные координаты, он легко обрабатывается путем передачи списка в конструктор.

Форма будет производиться с использованием фабрики. Потому что, хотя есть класс формы, каждая фигура будет настраиваться по-разному в зависимости от того, какой тип формы он имеет. Мы не знаем, какую форму мы собираемся инициализировать, пока пользователь не сделает выбор.

7
ответ дан RS Conley 26 August 2018 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: