DESIGN PATTERNS IN JAVA - Hướng dẫn Java Design Pattern – Abstract Factory

Hướng dẫn Java Design Pattern – Abstract Factory

Trong bài trước chúng ta đã tìm hiểu về Factory Method Pattern. Trong bài này chúng ta tiếp tục tìm hiểu một Pattern khác trong nhóm Creational Design PatternAbstract Factory Design Pattern.

Abstract Factory Pattern là gì?

Abstract Factory pattern là một trong những Creational pattern. Nó là phương pháp tạo ra một Super-factory dùng để tạo ra các Factory khác. Hay còn được gọi là Factory của các Factory. Abstract Factory Pattern là một Pattern cấp cao hơn so với Factory Method Pattern.

Trong Abstract Factory pattern, một interface có nhiệm vụ tạo ra một Factory của các object có liên quan tới nhau mà không cần phải chỉ ra trực tiếp các class của object. Mỗi Factory được tạo ra có thể tạo ra các object bằng phương pháp giống như Factory pattern.

Hãy tưởng tượng, Abstract factory như là một nhà máy lớn chứa nhiều nhà máy nhỏ, trong các nhà máy đó có những xưởng sản xuất, các xưởng đó tạo ra những sản phẩm khác nhau.

Cài đặt Abstract Factory Pattern như thế nào?

Một Abstract Factory Pattern bao gồm các thành phần cơ bản sau:

  • AbstractFactory: Khai báo dạng interface hoặc abstract class chứa các phương thức để tạo ra các đối tượng abstract.
  • ConcreteFactory: Xây dựng, cài đặt các phương thức tạo các đối tượng cụ thể.
  • AbstractProduct: Khai báo dạng interface hoặc abstract class để định nghĩa đối tượng abstract.
  • Product: Cài đặt của các đối tượng cụ thể, cài đặt các phương thức được quy định tại AbstractProduct.
  • Client: là đối tượng sử dụng AbstractFactory và các AbstractProduct.

Ví dụ: Một công ty đồ nội thất chuyên sản xuất ghế (Chair): ghế nhựa (PlasticChair) và ghế gỗ (WoodChair). Với tình hình kinh doanh ngày càng thuận thợi nên công ty quyết định mở rộng thêm sản xuất bàn (Table). Với lợi thế là đã có kinh nghiệm từ sản xuất ghế nên công ty vẫn giữ chất liệu là nhựa (PlasticTable) và gỗ (WoodTable) cho sản xuất bàn. Tuy nhiên, quy trình sản xuất ghế/ bàn theo từng chất liệu (MaterialType) là khác nhau. Nên công ty tách ra là nhà máy (Factory): 1 cho sản xuất vật liệu bằng nhựa (PlasticFactory), 1 cho sản xuất vật liệu bằng gỗ (WoodFactory), nhưng cả 2 đều có thể sản xuất ghế và bàn (FunitureAbstractFactory). Khi khách hàng cần mua một món đồ nào, khách hàng (Client) chỉ cần đến cửa hàng để mua (FunitureFactory). Khi đó ứng với từng hàng hóa và vật liệu sẽ được chuyển về phân xưởng tương ứng để sản xuất (createXXX) ra bàn (Table) và ghế (Chair).

Sử dụng Abstract Factory pattern trong Java

Tương tự như ví dị trên, trong ví dụ này, các buttons và checkboxes sẽ đóng vai trò là sản phẩm. Chúng có hai biến thể: macOS và Windows.

📁buttons: First product hierarchy

buttons/Button.java

public interface Button {
    void paint();
}

buttons/MacOSButton.java

public class MacOSButton implements Button {

    @Override
    public void paint() {
        System.out.println("You have created MacOSButton.");
    }
}

buttons/WindowsButton.java

public class WindowsButton implements Button {

    @Override
    public void paint() {
        System.out.println("You have created WindowsButton.");
    }
}

📁checkboxes: Second product hierarchy

checkboxes/Checkbox.java

public interface Checkbox {
    void paint();
}

checkboxes/MacOSCheckbox.java

public class MacOSCheckbox implements Checkbox {

    @Override
    public void paint() {
        System.out.println("You have created MacOSCheckbox.");
    }
}

checkboxes/WindowsCheckbox.java

public class WindowsCheckbox implements Checkbox {

    @Override
    public void paint() {
        System.out.println("You have created WindowsCheckbox.");
    }
}

📁factories

factories/GUIFactory.java: Abstract factory

public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

factories/MacOSFactory.java: Concrete factory (macOS)

public class MacOSFactory implements GUIFactory {

    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }
}

factories/WindowsFactory.java: Concrete factory (Windows)

public class WindowsFactory implements GUIFactory {

    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

📁app

app/Application.java: Client code

public class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void paint() {
        button.paint();
        checkbox.paint();
    }
}

Demo.java: App configuration

public class Demo {

    /**
     * Application picks the factory type and creates it in run time (usually at
     * initialization stage), depending on the configuration or environment
     * variables.
     */
    private static Application configureApplication() {
        Application app;
        GUIFactory factory;
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("mac")) {
            factory = new MacOSFactory();
            app = new Application(factory);
        } else {
            factory = new WindowsFactory();
            app = new Application(factory);
        }
        return app;
    }

    public static void main(String[] args) {
        Application app = configureApplication();
        app.paint();
    }
}

OutputDemo.txt: Execution result

You create WindowsButton.
You created WindowsCheckbox.

DESIGN PATTERNS IN JAVA - Tổng quan về Design Patterns

Hướng dẫn Java Design Pattern – Singleton

Hướng dẫn Java Design Pattern – Factory Method

Hướng dẫn Java Design Pattern – Builder

Hướng dẫn Java Design Pattern – Prototype

Hướng dẫn Java Design Pattern – Adapter

Hướng dẫn Java Design Pattern – Bridge

Hướng dẫn Java Design Pattern – Composite

Hướng dẫn Java Design Pattern – Decorator

Hướng dẫn Java Design Pattern – Facade

Hướng dẫn Java Design Pattern – Flyweight

Hướng dẫn Java Design Pattern – Proxy

Hướng dẫn Java Design Pattern – Chain of Responsibility

Hướng dẫn Java Design Pattern – Command

Hướng dẫn Java Design Pattern – Iterator

Hướng dẫn Java Design Pattern – Mediator

Hướng dẫn Java Design Pattern – Memento

Hướng dẫn Java Design Pattern – Observer

Hướng dẫn Java Design Pattern – State

Hướng dẫn Java Design Pattern – Strategy

Hướng dẫn Java Design Pattern – Template method

Hướng dẫn Java Design Pattern – Visitor