目 录CONTENT

文章目录

简单工厂模式、工厂方法模式和抽象工厂模式

在等晚風吹
2023-12-14 / 0 评论 / 0 点赞 / 18 阅读 / 0 字 / 正在检测是否收录...

设计模式之简单工厂模式、工厂方法模式和抽象工厂模式

简单工厂模式、工厂方法模式和抽象工厂模式

在软件设计中,工厂模式是一种常见的设计模式,它提供了一种创建对象的接口,而无需指定其具体类。在Java中,有三种主要的工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式。本文将深入探讨这三种工厂模式的区别、特点以及使用场景,并提供详细的代码示例。

1. 简单工厂模式

简单工厂模式是最基础的工厂模式,它由一个单一的工厂类负责创建对象。这个工厂类根据客户端的需求,决定实例化哪个具体的产品类。虽然简单,但也存在一些局限性。

特点:

  • 单一工厂类负责所有产品的创建,可能导致该类臃肿。
  • 客户端只需知道产品的类型,无需关心具体的实现。

代码示例:

// 简单工厂模式
class SimpleFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

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

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

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

// 客户端
public class SimpleFactoryClient {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.display();

        Product productB = SimpleFactory.createProduct("B");
        productB.display();
    }
}

2. 工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象,它通过定义一个工厂接口,由具体的工厂子类负责创建产品。每个工厂子类对应一个具体的产品,从而实现了更好的可扩展性。

特点:

  • 引入了抽象工厂接口,每个具体工厂都实现了这个接口。
  • 每个具体工厂负责创建一个具体产品,符合开放-封闭原则。
  • 客户端通过工厂接口调用,降低了与具体产品的耦合。

代码示例:

// 工厂方法模式
// 产品接口
interface Product {
    void display();
}

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

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

// 工厂接口
interface Factory {
    Product createProduct();
}

// 具体工厂类A
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂类B
class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端
public class FactoryMethodClient {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.display();

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.display();
    }
}

3. 抽象工厂模式

抽象工厂模式是一种更高级别的工厂模式,它允许一个工厂创建一系列相关或依赖的产品。抽象工厂模式通常包括多个抽象产品和多个具体工厂,每个具体工厂负责创建一族相关产品。

特点:

  • 引入了抽象工厂接口,包含多个用于创建产品的方法。
  • 每个具体工厂都实现了抽象工厂接口,负责创建一族相关的产品。
  • 支持产品族的创建,例如在一个工厂中创建按钮和文本框,而在另一个工厂中创建滚动条和复选框。

代码示例:

// 抽象工厂模式
// 抽象产品接口
interface Button {
    void display();
}

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

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

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

// 具体工厂类A
class ConcreteGUIFactoryA implements GUIFactory {
    @Override
    public Button createButton() {
        return new ConcreteButtonA();
    }
}

// 具体工厂类B
class ConcreteGUIFactoryB implements GUIFactory {
    @Override
    public Button createButton() {
        return new ConcreteButtonB();
    }
}

// 客户端
public class AbstractFactoryClient {
    public static void main(String[] args) {
        GUIFactory factoryA = new ConcreteGUIFactoryA();
        Button buttonA = factoryA.createButton();
        buttonA.display();

        GUIFactory factoryB = new ConcreteGUIFactoryB();
        Button buttonB = factoryB.createButton();
        buttonB.display();
    }
}

比较与选择

  • 简单工厂模式适用于单一产品的场景,实现简单但不够灵活。
  • 工厂方法模式更具扩展性,每个具体工厂负责一个产品,符合开放-封闭原则。
  • 抽象工厂模式适用于产品族的创建,每个具体工厂创建一组相关产品,使得系统更具弹性和可维护性。

选择合适的工厂模式取决于项目需求和设计目标。在实际应用中,根据具体情况选择适当的工厂模式,可以提高代码的可维护性和灵活性。

0

评论区