Назад к вопросам
Middle
68
questionbank

Можешь привести пример использования паттерна проектирования 'Фабрика' в Android фреймворке?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

// Абстрактный класс или интерфейс продукта
interface TextView {
    void setText(String text);
    void setTextColor(int color);
}

// Конкретный класс продукта для стандартного TextView
class StandardTextView implements TextView {
    android.widget.TextView internalTextView;

    StandardTextView(android.content.Context context) {
        internalTextView = new android.widget.TextView(context);
    }

    @Override
    public void setText(String text) {
        internalTextView.setText(text);
    }

    @Override
    public void setTextColor(int color) {
        internalTextView.setTextColor(color);
    }
}

// Конкретный класс продукта для Bold TextView
class BoldTextView implements TextView {
    android.widget.TextView internalTextView;

    BoldTextView(android.content.Context context) {
        internalTextView = new android.widget.TextView(context);
        internalTextView.setTypeface(null, android.graphics.Typeface.BOLD);
    }

    @Override
    public void setText(String text) {
        internalTextView.setText(text);
    }

    @Override
    public void setTextColor(int color) {
        internalTextView.setTextColor(color);
    }
}

// Абстрактный класс фабрики
abstract class TextViewFactory {
    abstract TextView createTextView(android.content.Context context);
}

// Конкретная фабрика для стандартного TextView
class StandardTextViewFactory extends TextViewFactory {
    @Override
    TextView createTextView(android.content.Context context) {
        return new StandardTextView(context);
    }
}

// Конкретная фабрика для Bold TextView
class BoldTextViewFactory extends TextViewFactory {
    @Override
    TextView createTextView(android.content.Context context) {
        return new BoldTextView(context);
    }
}

// Пример использования в Activity
class MyActivity extends androidx.appcompat.app.AppCompatActivity {

    @Override
    protected void onCreate(android.os.Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...

        TextViewFactory standardFactory = new StandardTextViewFactory();
        TextView standardTextView = standardFactory.createTextView(this);
        standardTextView.setText("Привет, мир!");

        TextViewFactory boldFactory = new BoldTextViewFactory();
        TextView boldTextView = boldFactory.createTextView(this);
        boldTextView.setText("Жирный текст");

        // Добавление в layout
        android.widget.LinearLayout linearLayout = new android.widget.LinearLayout(this);
        linearLayout.setOrientation(android.widget.LinearLayout.VERTICAL);
        linearLayout.addView(((StandardTextView) standardTextView).internalTextView);
        linearLayout.addView(((BoldTextView) boldTextView).internalTextView);
        setContentView(linearLayout);
    }
}

Приведенный пример иллюстрирует использование паттерна Фабрика для создания различных типов TextView. Абстрактная фабрика TextViewFactory определяет метод createTextView, а конкретные фабрики StandardTextViewFactory и BoldTextViewFactory реализуют создание конкретных типов TextView (StandardTextView и BoldTextView соответственно). Это позволяет коду, который использует фабрики, быть независимым от конкретных реализаций TextView.

В контексте Android фреймворка, паттерн Фабрика часто проявляется в классах, которые создают другие объекты с различными конфигурациями или реализациями в зависимости от контекста или параметров. Например, система может использовать внутренние фабрики для создания различных типов ViewGroup или Drawable в зависимости от XML-разметки или других параметров.