Введение в Factory Pattern на Android
Factory Pattern — один из самых популярных творческих шаблонов. Я сам использовал его в нескольких проектах, один из них — кроссплатформенное приложение с открытым исходным кодом, написанное на Dart. Приложение Джокер. Но вы можете проверить Кофеварка если вы просто хотите увидеть коды и не заботитесь об объяснениях.
Фабричный шаблон, как следует из названия, использует фабричные методы для решения проблемы создания нескольких объектов без указания точного класса объекта, который будет создан. В Android (Kotlin/Java) это достигается за счет реализации общего интерфейса в классах и предоставления доступа к объектам класса через метод Factory. Лучший способ увидеть, как это работает, — создать проект, реализующий все, что я только что объяснил. Откройте Android Studio и начните новый проект. Мы собираемся создать мини-приложение, которое генерирует объект для представления различных вариантов кофе. Для простоты я сосредоточусь только на шаблоне. Приложение вернет название и рецепты каждого варианта кофе в виде строки.
Как построить фабричный шаблон
- Я предположил, что вы создали новый проект в своей Android Studio, теперь отредактируйте MainActivity.java
- Щелкните его правой кнопкой мыши и создайте новый интерфейс Kotlin File/Class с именем Coffee.
- Отредактируйте интерфейс и создайте внутри него два метода, а именно имя и рецепты.
interface Coffee {
fun name(): String
fun recipe(): String
}
- Создайте конкретные классы, реализующие интерфейс 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"
}
- Теперь создайте новый класс с именем 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
}
}
Ура! были сделаны. Теперь вы можете запустить свое приложение на реальном устройстве или эмуляторе.