Введение в Factory Pattern на Android

Factory Pattern — один из самых популярных творческих шаблонов. Я сам использовал его в нескольких проектах, один из них — кроссплатформенное приложение с открытым исходным кодом, написанное на Dart. Приложение Джокер. Но вы можете проверить Кофеварка если вы просто хотите увидеть коды и не заботитесь об объяснениях.

Фабричный шаблон, как следует из названия, использует фабричные методы для решения проблемы создания нескольких объектов без указания точного класса объекта, который будет создан. В Android (Kotlin/Java) это достигается за счет реализации общего интерфейса в классах и предоставления доступа к объектам класса через метод Factory. Лучший способ увидеть, как это работает, — создать проект, реализующий все, что я только что объяснил. Откройте Android Studio и начните новый проект. Мы собираемся создать мини-приложение, которое генерирует объект для представления различных вариантов кофе. Для простоты я сосредоточусь только на шаблоне. Приложение вернет название и рецепты каждого варианта кофе в виде строки.

Как построить фабричный шаблон

  1. Я предположил, что вы создали новый проект в своей Android Studio, теперь отредактируйте MainActivity.java
  2. Щелкните его правой кнопкой мыши и создайте новый интерфейс Kotlin File/Class с именем Coffee.
    Скриншот 2019-03-02 в 5:55:14.png
  3. Отредактируйте интерфейс и создайте внутри него два метода, а именно имя и рецепты.
interface Coffee {
   fun name(): String
   fun recipe(): String
  }
  1. Создайте конкретные классы, реализующие интерфейс Coffee.
class CaffeLatte : Coffee {
    override fun name(): String  ="CaffeLatte"
    override fun recipe(): String  ="Expresso"
}

 class Americano : Coffee {
    override fun recipes(): String = "Expresso, Hot water"
    override fun name(): String = "Caffè Americano"
  }

  1. Теперь создайте новый класс с именем CoffeeFactory, который выглядит как приведенный ниже фрагмент кода:
object CoffeeFactory {

    enum class Type{
        LATTE, AMERICANO
    }

    fun getCoffee(type: Type): Coffee{
        if (type == CoffeeFactory.Type.LATTE){
            return CafeLatte()
        }else if(type == CoffeeFactory.Type.AMERICANO){
            return Americano()
        }
        throw IllegalArgumentException("Can't handle your command ${type.name}")
    }
}

Мы закончили с шаблоном, теперь давайте отобразим рецепты кофе и название на экране.

Измените макет Activity_main.xml. Скопируйте/вставьте код ниже:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="
        xmlns:tools="
        xmlns:app="
        android:layout_width="match_parent"
        android:padding="10dp"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:text="Hello World!"
            android:paddingBottom="5dp"
            android:id="@+id/coffee_name"
            android:textAppearance="?android:textAppearanceMedium"
            app:layout_constraintTop_toTopOf="parent"/>


    <TextView
            android:layout_width="wrap_content"
            android:paddingBottom="10dp"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:id="@+id/coffee_recipe"
            android:textAppearance="?android:textAppearanceMedium"
            app:layout_constraintTop_toBottomOf="@id/coffee_name"/>


    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Change Type"
            android:id="@+id/coffee_btn"
            android:textAppearance="?android:textAppearanceMedium"
            app:layout_constraintTop_toBottomOf="@id/coffee_recipe"/>

</android.support.constraint.ConstraintLayout>

Отредактируйте файл MainActivity.java. Ссылайтесь на TextViews из макета и установите тексты. Кнопка изменит текст при нажатии

class MainActivity : AppCompatActivity() {

    private var isChanged: Boolean =false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Set button click
        coffee_btn.setOnClickListener(this::changeCoffee)

    }

    /**
     * Change coffee recipe and name when button is clicked
     */
    fun changeCoffee(view: View){
        var factory: Coffee
        if (isChanged){
            factory = CoffeeFactory.getCoffee(CoffeeFactory.Type.AMERICANO)
            isChanged = false
        }else{
            factory = CoffeeFactory.getCoffee(CoffeeFactory.Type.LATTE)
            isChanged = true
        }

        changeCoffeeType(factory.recipes(), factory.name())
    }

    /**
     * Method that changes the coffee type
     */
    private fun changeCoffeeType(recipe: String, name: String){

        coffee_recipe.text = recipe

        coffee_name.text =name
    }
}

Ура! были сделаны. Теперь вы можете запустить свое приложение на реальном устройстве или эмуляторе.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *