工厂模式与抽象工厂模式的区别

 2024-07-29    0 条评论    58 浏览

设计模式

摘自AI生成

工厂设计模式(Factory Design Pattern)和抽象工厂设计模式(Abstract Factory Design Pattern)都是常见的创建型设计模式,它们用于解决对象创建的复杂性,并提供了一种灵活的方式来创建对象实例。

工厂设计模式(Factory Design Pattern)

工厂设计模式旨在提供一个统一的接口,用于创建对象,但具体创建哪种类型的对象则由子类决定。这种模式通过将对象的实例化过程延迟到子类来实现,从而达到解耦的效果。

示例代码

// 产品接口
interface Product {
    void display();
}

// 具体产品类A
class ConcreteProductA implements Product {
    @Override
    public void display() {
        System.out.println("Concrete Product A");
    }
}

// 具体产品类B
class ConcreteProductB implements Product {
    @Override
    public void display() {
        System.out.println("Concrete Product B");
    }
}

// 工厂类
class Factory {
    // 工厂方法,根据传入的类型创建对应的产品实例
    public Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
public class FactoryPatternExample {
    public static void main(String[] args) {
        Factory factory = new Factory();
        
        // 创建具体产品A
        Product productA = factory.createProduct("A");
        productA.display();
        
        // 创建具体产品B
        Product productB = factory.createProduct("B");
        productB.display();
    }
}

抽象工厂设计模式(Abstract Factory Design Pattern)

抽象工厂设计模式是工厂方法模式的进一步扩展,它不仅提供了创建对象的接口,还定义了一组相关或依赖对象的创建方法,形成一个产品族。这种模式允许客户端使用抽象的接口来创建一组相关的产品,而无需指定具体的实现类。

示例代码

// 抽象产品接口族
interface Button {
    void display();
}

interface Checkbox {
    void display();
}

// 具体产品族A
class MacOSButton implements Button {
    @Override
    public void display() {
        System.out.println("Displaying MacOS Button");
    }
}

class MacOSCheckbox implements Checkbox {
    @Override
    public void display() {
        System.out.println("Displaying MacOS Checkbox");
    }
}

// 具体产品族B
class WindowsButton implements Button {
    @Override
    public void display() {
        System.out.println("Displaying Windows Button");
    }
}

class WindowsCheckbox implements Checkbox {
    @Override
    public void display() {
        System.out.println("Displaying Windows Checkbox");
    }
}

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// 具体工厂类:MacOS工厂
class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

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

// 具体工厂类:Windows工厂
class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

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

// 客户端代码
public class AbstractFactoryPatternExample {
    public static void main(String[] args) {
        // 创建MacOS风格的工厂
        GUIFactory macFactory = new MacOSFactory();
        
        // 创建MacOS风格的按钮和复选框
        Button macButton = macFactory.createButton();
        macButton.display();
        
        Checkbox macCheckbox = macFactory.createCheckbox();
        macCheckbox.display();
        
        // 创建Windows风格的工厂
        GUIFactory windowsFactory = new WindowsFactory();
        
        // 创建Windows风格的按钮和复选框
        Button windowsButton = windowsFactory.createButton();
        windowsButton.display();
        
        Checkbox windowsCheckbox = windowsFactory.createCheckbox();
        windowsCheckbox.display();
    }
}

区别总结

  1. 目的不同

    • 工厂设计模式旨在提供一个创建对象的接口,由子类决定实例化哪个具体类。
    • 抽象工厂设计模式提供一个创建一组相关或依赖对象的接口,而无需指定具体的类。
  2. 使用方式不同

    • 工厂设计模式通过继承实现,客户端使用工厂方法来创建对象。
    • 抽象工厂设计模式通过对象组合实现,客户端使用抽象工厂来创建一组相关的对象。
  3. 产品类型不同

    • 工厂设计模式通常只涉及一个产品的创建。
    • 抽象工厂设计模式涉及一组相关产品的创建,这些产品通常是一个产品族,例如操作系统的按钮和复选框。

通过这些示例和区别,希望能帮助你更好地理解和区分工厂设计模式与抽象工厂设计模式在Java中的应用和差异。

抽象工厂设计模式的意义

抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需指定他们的具体类。

意义:

  1. 解耦: 抽象工厂模式解耦了抽象产品和具体产品的实现,使得客户仅需要与抽象产品接口打交道,而不必关心具体产品的实现细节。

  2. 扩展性: 容易扩展新的产品家族,只需实现新的抽象工厂和具体产品类,而无需修改现有的代码。

  3. 统一性: 抽象工厂模式可以确保创建的产品具有统一的风格和特征,从而保证产品家族的整体一致性。

具体应用举例:

  • GUI :

    • 抽象工厂: GUIFactory
    • 抽象产品: Button, TextBox, Window
    • 具体工厂: WindowsGUIFactory, MacGUIFactory
    • 具体产品: WindowsButton, WindowsTextBox, WindowsWindow

    不同的平台需要不同的 GUI 组件,抽象工厂模式可以将不同的 GUI 组件的创建逻辑封装起来,使得可以灵活切换不同平台。

  • 数据库访问:

    • 抽象工厂: DatabaseFactory
    • 抽象产品: Connection, Statement, ResultSet
    • 具体工厂: MySQLFactory, OracleFactory
    • 具体产品: MySQLConnection, MySQLStatement, MySQLResultSet

    不同的数据库系统需要不同的连接、语句和结果集对象,抽象工厂模式可以将不同的数据库访问逻辑封装起来,使得可以支持多种数据库系统。