Browse Source

Initial commit

MrOzOn 4 năm trước cách đây
commit
488369a63e
30 tập tin đã thay đổi với 714 bổ sung0 xóa
  1. 2 0
      .gitignore
  2. 3 0
      .idea/.gitignore
  3. 10 0
      .idea/codeStyles/Project.xml
  4. 5 0
      .idea/codeStyles/codeStyleConfig.xml
  5. 6 0
      .idea/kotlinc.xml
  6. 15 0
      .idea/libraries/KotlinJavaRuntime.xml
  7. 6 0
      .idea/misc.xml
  8. 8 0
      .idea/modules.xml
  9. 124 0
      .idea/uiDesigner.xml
  10. 12 0
      PatternDesign.iml
  11. 91 0
      src/creational_patterns/README.MD
  12. 15 0
      src/creational_patterns/abstract_factory/AbstractGUI.kt
  13. 23 0
      src/creational_patterns/abstract_factory/MacGUI.kt
  14. 22 0
      src/creational_patterns/abstract_factory/WindowsGUI.kt
  15. 15 0
      src/creational_patterns/abstract_factory/main.kt
  16. 33 0
      src/creational_patterns/builder/CarAnother.kt
  17. 45 0
      src/creational_patterns/builder/CarBuilder.kt
  18. 11 0
      src/creational_patterns/builder/Director.kt
  19. 16 0
      src/creational_patterns/builder/IBuilder.kt
  20. 41 0
      src/creational_patterns/builder/ManualBuilder.kt
  21. 30 0
      src/creational_patterns/builder/main.kt
  22. 18 0
      src/creational_patterns/factory_method/Dialog.kt
  23. 15 0
      src/creational_patterns/factory_method/WebDialog.kt
  24. 15 0
      src/creational_patterns/factory_method/WindowsDialog.kt
  25. 9 0
      src/creational_patterns/factory_method/main.kt
  26. 17 0
      src/creational_patterns/prototype/ImageItem.kt
  27. 5 0
      src/creational_patterns/prototype/ReportItemPrototype.kt
  28. 25 0
      src/creational_patterns/prototype/Reports.kt
  29. 30 0
      src/creational_patterns/prototype/TextItem.kt
  30. 47 0
      src/creational_patterns/prototype/main.kt

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+# Project exclude paths
+/out/

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 10 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,10 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <JetCodeStyleSettings>
+      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+    </JetCodeStyleSettings>
+    <codeStyleSettings language="kotlin">
+      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 5 - 0
.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+  </state>
+</component>

+ 6 - 0
.idea/kotlinc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Kotlin2JvmCompilerArguments">
+    <option name="jvmTarget" value="1.8" />
+  </component>
+</project>

+ 15 - 0
.idea/libraries/KotlinJavaRuntime.xml

@@ -0,0 +1,15 @@
+<component name="libraryTable">
+  <library name="KotlinJavaRuntime">
+    <CLASSES>
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib.jar!/" />
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar!/" />
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-test.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES>
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-sources.jar!/" />
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect-sources.jar!/" />
+      <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-test-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/PatternDesign.iml" filepath="$PROJECT_DIR$/PatternDesign.iml" />
+    </modules>
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 12 - 0
PatternDesign.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="KotlinJavaRuntime" level="project" />
+  </component>
+</module>

+ 91 - 0
src/creational_patterns/README.MD

@@ -0,0 +1,91 @@
+#Абстрактная фабрика (Abstract Factory)
+
+Это порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
+
+Другими словами, предоставляет интерфейс для создания семейств взаимосвязанных объектов, не специфицируя их конкретных классов.
+
+## Применимость
+
+- система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты
+- система должна настраиваться одним из семейств объектов
+- входящие в семейство взаимосвязанные объекты спроектированы для совместной работы, и вы должны обеспечить выполнение этого ограничения
+- вы хотите предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию
+
+## Отношения
+
+- обычно во время выполнения создается единственный экземпляр класса конкретной реализации фабрики (**MacFactory**)
+- абстрактная фабрика передоверяет создание объектов-продуктов своему подклассу (**MacFactory**)
+
+## Результаты
+
+- изолируются конкретные классы, клиент не знает подробностей реализации классов, а взаимодействуют только через их абстрактные интерфейсы
+- упрощается замена семейств продуктов
+- гарантируется сочетаемость продуктов
+- НЕ УПРОЩАЕТ задачу поддержки нового вида продукта, так как необходимо расширить интерфейс абстрактной фабрики, НО и всех его подклассов
+
+#Строитель (Builder)
+
+Это порождающий паттерн проектирования, который позволяет создавать сложные объекты пошагово. Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов
+
+## Применимость
+
+- алгоритм сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой
+- процесс конструирования должен обеспечивать различные представления конструируемого объекта
+
+## Отношения
+
+- клиент создает объект-распорядитель Director и настраивает его нужным объектом-строителем Builder
+- распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта
+- строитель обрабатывает запросы распорядителя и добавляет новые части к продукту
+- клиент забирает продукт у строителя
+
+## Результаты
+
+- позволяет изменять внутреннее представление продукта
+- изолирует код, реализующий̆ конструирование и представление
+- предоставляет более точный̆ контроль над процессом конструирования
+
+#Фабричный метод (Factory Method)
+
+Это паттерн, порождающий̆ классы.
+
+Это паттерн, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
+
+## Применимость
+
+- классу заранее неизвестно, объекты каких классов ему нужно создавать
+- класс спроектирован так, чтобы объекты, которые он создает, определялись подклассами
+- класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и вам нужно локализовать информацию о том, какой̆ класс принимает эти обязанности на себя
+
+## Отношения
+
+Создатель полагается на свои подклассы в определении фабричного метода, который̆ будет возвращать экземпляр подходящего конкретного продукта.
+
+## Результаты
+
+Фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом класса, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов.
+
+#Прототип (Prototype)
+
+Это паттерн, который задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа
+
+## Применимость
+
+Система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты; _кроме того_:
+- классы для создания экземпляров определяются во время выполнения, например с помощью динамической загрузки; _или_
+- для того чтобы избежать построения иерархий классов или фабрик, па- раллельных иерархии классов продуктов; _или_
+- экземпляры класса могут находиться в одном из не очень большого числа различных состояний.
+
+## Отношения
+
+Клиент обращается к прототипу, чтобы тот создал свою копию.
+
+## Результаты
+
+У прототипа те же самые результаты, что у **абстрактной фабрики** и **строителя**: он скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен. Кроме того, все эти паттерны позволяют клиентам работать с классами, специфичными для приложения, без модификаций.
+Дополнительные преимущества паттерна:
+- добавление и удаление продуктов во время выполнения
+- определение новых объектов путем изменения значений
+- уменьшение числа подклассов
+- динамическая настройка конфигурации приложения классами
+

+ 15 - 0
src/creational_patterns/abstract_factory/AbstractGUI.kt

@@ -0,0 +1,15 @@
+package creational_patterns.abstract_factory
+
+//abstract factory!!!
+interface GUIFactory {
+    fun createButton(): Button
+    fun createCheckbox(): Checkbox
+}
+
+interface Button {
+    fun paint()
+}
+
+interface Checkbox {
+    fun paint()
+}

+ 23 - 0
src/creational_patterns/abstract_factory/MacGUI.kt

@@ -0,0 +1,23 @@
+package creational_patterns.abstract_factory
+
+class MacFactory: GUIFactory {
+
+    init {
+        println("using Mac")
+    }
+
+    class MacButton: Button {
+        override fun paint() {
+            println("paint button on MAC style")
+        }
+    }
+
+    class MacCheckbox: Checkbox {
+        override fun paint() {
+            println("paint checkbox on MAC style")
+        }
+    }
+
+    override fun createButton(): Button = MacButton()
+    override fun createCheckbox(): Checkbox = MacCheckbox()
+}

+ 22 - 0
src/creational_patterns/abstract_factory/WindowsGUI.kt

@@ -0,0 +1,22 @@
+package creational_patterns.abstract_factory
+
+class WinFactory: GUIFactory {
+    init {
+        println("using Windows")
+    }
+
+    class WinButton: Button {
+        override fun paint() {
+            println("paint button on WINDOWS style")
+        }
+    }
+
+    class WinCheckbox: Checkbox {
+        override fun paint() {
+            println("paint checkbox on WINDOWS style")
+        }
+    }
+
+    override fun createButton(): Button = WinButton()
+    override fun createCheckbox(): Checkbox = WinCheckbox()
+}

+ 15 - 0
src/creational_patterns/abstract_factory/main.kt

@@ -0,0 +1,15 @@
+package creational_patterns.abstract_factory
+
+fun showGUI(factory: GUIFactory) {
+    val button = factory.createButton()
+    button.paint()
+    val checkbox = factory.createCheckbox()
+    checkbox.paint()
+}
+
+fun main() {
+    // Using Mac
+    showGUI(MacFactory())
+    // Using Windows
+    showGUI(WinFactory())
+}

+ 33 - 0
src/creational_patterns/builder/CarAnother.kt

@@ -0,0 +1,33 @@
+package creational_patterns.builder
+
+class ModernCar private constructor(
+    val seats: Int?,
+    val engine: Engine?,
+    val tripCounter: Int?,
+    val GPS: Boolean?
+){
+    data class Builder (
+        var seats: Int = 1,
+        var engine: Engine = Engine.DriveCar,
+        var tripCounter: Int = 5,
+        var GPS: Boolean = false) {
+
+        fun seats(seats: Int) = apply { this.seats = seats }
+        fun engine(engine: Engine) = apply { this.engine = engine }
+        fun tripCounter(tripCounter: Int) = apply { this.tripCounter = tripCounter }
+        fun GPS(enabled: Boolean) = apply { this.GPS = enabled }
+
+        fun build() = ModernCar(seats, engine, tripCounter, GPS)
+    }
+
+    fun getInfo(){
+        val info = """
+            Your car have specification:
+            Count seats=$seats
+            Engine = $engine
+            TripCounter have $tripCounter speeds
+            GPS including = $GPS
+        """.trimIndent()
+        println(info)
+    }
+}

+ 45 - 0
src/creational_patterns/builder/CarBuilder.kt

@@ -0,0 +1,45 @@
+package creational_patterns.builder
+
+class Car {
+    var seats: Int = 1
+    var engine: Engine = Engine.DriveCar
+    var tripCounter: Int = 5
+    var GPS: Boolean = false
+
+    fun getTechnicalInfo(){
+        val info = """
+            Your car have specification:
+            Count seats=$seats
+            Engine = $engine
+            TripCounter have $tripCounter speeds
+            GPS including = $GPS
+        """.trimIndent()
+        println(info)
+    }
+}
+
+class CarBuilder : Builder<Car> {
+    private var car = Car()
+
+    override fun reset() {
+        car = Car()
+    }
+
+    override fun setSeats(number: Int) {
+        car.seats = number
+    }
+
+    override fun setEngine(engine: Engine) {
+        car.engine = engine
+    }
+
+    override fun setTripCounter(number: Int) {
+        car.tripCounter = number
+    }
+
+    override fun setGPS(enabled: Boolean) {
+        car.GPS = enabled
+    }
+
+    override fun getResult() = car
+}

+ 11 - 0
src/creational_patterns/builder/Director.kt

@@ -0,0 +1,11 @@
+package creational_patterns.builder
+
+class Director {
+    fun constructSportCar(builder: Builder<*>){
+        builder.reset()
+        builder.setSeats(2)
+        builder.setEngine(Engine.SportCar)
+        builder.setTripCounter(7)
+//        builder.setGPS(true)
+    }
+}

+ 16 - 0
src/creational_patterns/builder/IBuilder.kt

@@ -0,0 +1,16 @@
+package creational_patterns.builder
+
+enum class Engine {
+    DriveCar,
+    SportCar,
+    PremiumCar
+}
+
+interface Builder<T> {
+    fun reset()
+    fun setSeats(number: Int)
+    fun setEngine(engine: Engine)
+    fun setTripCounter(number: Int)
+    fun setGPS(enabled: Boolean)
+    fun getResult(): T
+}

+ 41 - 0
src/creational_patterns/builder/ManualBuilder.kt

@@ -0,0 +1,41 @@
+package creational_patterns.builder
+
+class Manual {
+    var text = ""
+
+    fun showManual() {
+        println(text)
+    }
+}
+
+class ManualBuilder : Builder<Manual> {
+
+    private var manual = Manual().apply {
+        text = "Your manual include sections:\n"
+    }
+
+    override fun reset() {
+        manual.text = "Your manual include sections:\n"
+    }
+
+    override fun setSeats(number: Int) {
+        manual.text += "\thow using seats\n"
+    }
+
+    override fun setEngine(engine: Engine) {
+        manual.text += "\thow using engine\n"
+    }
+
+    override fun setTripCounter(number: Int) {
+        manual.text += "\thow using different speeds\n"
+    }
+
+    override fun setGPS(enabled: Boolean) {
+        manual.text += "\thow using GPS module\n"
+    }
+
+    override fun getResult(): Manual {
+        manual.text.trim()
+        return manual
+    }
+}

+ 30 - 0
src/creational_patterns/builder/main.kt

@@ -0,0 +1,30 @@
+package creational_patterns.builder
+
+//https://refactoring.guru/ru/design-patterns/builder
+
+fun main() {
+
+    println("This is builder pattern for single class")
+    val modernCar = ModernCar.Builder()
+        .seats(2)
+        .engine(Engine.PremiumCar)
+        .GPS(false)
+        .tripCounter(11)
+        .build()
+    modernCar.getInfo()
+
+    // OR
+
+    println("\nThis is builder pattern for some class with director")
+    val director = Director()
+
+    val carBuilder = CarBuilder()
+    director.constructSportCar(carBuilder)
+    val car = carBuilder.getResult()
+    car.getTechnicalInfo()
+
+    val manualBuilder = ManualBuilder()
+    director.constructSportCar(manualBuilder)
+    val manual = manualBuilder.getResult()
+    manual.showManual()
+}

+ 18 - 0
src/creational_patterns/factory_method/Dialog.kt

@@ -0,0 +1,18 @@
+package creational_patterns.factory_method
+
+interface Button {
+    fun render()
+    fun onClick(f: ()-> Unit)
+}
+
+abstract class Dialog {
+    fun render() {
+        val okButton = createButton()
+        okButton.onClick {
+            println("okButton clicked")
+        }
+        okButton.render()
+    }
+    // factory method
+    abstract fun createButton(): Button
+}

+ 15 - 0
src/creational_patterns/factory_method/WebDialog.kt

@@ -0,0 +1,15 @@
+package creational_patterns.factory_method
+
+class HTMLButton : Button {
+    override fun render() {
+        println("render HTMLButton")
+    }
+    override fun onClick(f: () -> Unit) {
+        f()
+        println("clicked HTMLButton")
+    }
+}
+
+class WebDialog : Dialog() {
+    override fun createButton(): Button = HTMLButton()
+}

+ 15 - 0
src/creational_patterns/factory_method/WindowsDialog.kt

@@ -0,0 +1,15 @@
+package creational_patterns.factory_method
+
+class WindowsButton : Button {
+    override fun render() {
+        println("render WindowsButton")
+    }
+    override fun onClick(f: () -> Unit) {
+        f()
+        println("clicked WindowsButton")
+    }
+}
+
+class WindowsDialog : Dialog() {
+    override fun createButton(): Button = WindowsButton()
+}

+ 9 - 0
src/creational_patterns/factory_method/main.kt

@@ -0,0 +1,9 @@
+package creational_patterns.factory_method
+
+fun main() {
+    val dialog1 = WindowsDialog()
+    dialog1.render()
+
+    val dialog2 = WebDialog()
+    dialog2.render()
+}

+ 17 - 0
src/creational_patterns/prototype/ImageItem.kt

@@ -0,0 +1,17 @@
+package creational_patterns.prototype
+
+class ImageItem : ReportItemPrototype {
+
+    var url: String? = null
+    var width: Int? = null
+
+    constructor()
+
+    constructor(source: ImageItem) {
+        this.url = source.url
+        this.width = source.width
+    }
+
+    override fun clone(): ImageItem = ImageItem(this)
+
+}

+ 5 - 0
src/creational_patterns/prototype/ReportItemPrototype.kt

@@ -0,0 +1,5 @@
+package creational_patterns.prototype
+
+interface ReportItemPrototype {
+    fun clone(): ReportItemPrototype
+}

+ 25 - 0
src/creational_patterns/prototype/Reports.kt

@@ -0,0 +1,25 @@
+package creational_patterns.prototype
+
+class Report {
+    fun printReport(reportItems: MutableMap<String, ReportItemPrototype>) {
+        reportItems.forEach { (key, value) ->
+            when (value) {
+                is TextItem -> println("$key TextItem $value")
+                is ImageItem -> println("$key ImageItem $value")
+            }
+        }
+    }
+}
+
+//cache OR manager OR registry prototypes
+class ReportItemsCache {
+    private val reportItems: MutableMap<String, ReportItemPrototype> = mutableMapOf()
+
+    fun addItem(key: String, newItem: ReportItemPrototype){
+        reportItems[key] = newItem
+    }
+
+    fun getItem(key: String): ReportItemPrototype {
+        return reportItems[key]?.clone() ?: throw Exception("no item with this key")
+    }
+}

+ 30 - 0
src/creational_patterns/prototype/TextItem.kt

@@ -0,0 +1,30 @@
+package creational_patterns.prototype
+
+enum class Color {
+    Black,
+    White,
+    Red,
+    Green,
+    Blue
+}
+
+class TextItem: ReportItemPrototype {
+
+    var text: String? = null
+    var color: Color? = null
+
+    constructor()
+
+    constructor(source: TextItem) {
+        this.text = source.text
+        this.color = source.color
+    }
+
+    fun initializeText(newText: String, newColor: Color) {
+        this.text = newText
+        this.color = newColor
+    }
+
+    override fun clone(): TextItem = TextItem(this)
+
+}

+ 47 - 0
src/creational_patterns/prototype/main.kt

@@ -0,0 +1,47 @@
+package creational_patterns.prototype
+
+
+
+fun main() {
+    val report = Report()
+    val reportItems: MutableMap<String, ReportItemPrototype> = mutableMapOf()
+
+    val text = TextItem()
+    text.text = "Normal text"
+    text.color = Color.Black
+    reportItems["Normal text"] = text
+
+    val image = ImageItem()
+    image.url = "/image/url"
+    image.width = 100
+    reportItems["Normal image"] = image
+
+    report.printReport(reportItems)
+
+    val redText = text.clone()
+    redText.initializeText("Red text", Color.Red)
+    reportItems["Red text"] = redText
+
+    val secondImage = image.clone()
+    reportItems["Second image"] = secondImage
+
+    println("\nUpdated report")
+
+    report.printReport(reportItems)
+
+    // OR Using Cache
+
+    println()
+    val reportItemsCache = ReportItemsCache()
+    reportItemsCache.addItem("item1",text)
+    reportItemsCache.addItem("item2",image)
+
+    //get item from registry by key
+    val first = reportItemsCache.getItem("item1")
+//    val first = reportItemsCache.getItem("item144") // BAD KEY
+    when (first) {
+        // edit used fields and use it
+        is TextItem -> println("text with text=${first.text} color=${first.color}")
+        is ImageItem -> println("image with url=${first.url} width=${first.width}")
+    }
+}