侧边栏壁纸
  • 累计撰写 52 篇文章
  • 累计创建 22 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

工厂方法模式(Factory Method)

镇沛
2024-09-20 / 0 评论 / 0 点赞 / 16 阅读 / 0 字

概述

工厂方法模式是一种广泛应用于面向对象编程中的设计模式,属于创建型模式的一种。该模式的核心在于定义一个用于创建对象的接口,但让子类去决定具体实例化哪一个类。这种设计使得对象的创建过程更加灵活,易于扩展,同时遵循了软件工程中的“开放封闭原则”——即对扩展开放,对修改封闭。

基本结构

  • 产品接口(Product Interface):定义了一个产品的接口,具体产品需要实现这个接口。

  • 具体产品(Concrete Product):实现了产品接口的具体类,不同的具体产品代表了不同的产品对象。

  • 工厂接口(Factory Interface):声明了一个用于创建产品的工厂方法,返回类型为产品接口。

  • 具体工厂(Concrete Factory):实现了工厂接口,负责实例化具体产品对象,每个具体工厂通常只生产一种具体产品。

工作原理

客户端不直接调用new操作来实例化对象,而是通过调用工厂方法来创建对象。这样做的好处在于,如果需要引入新的产品种类,只需增加一个新的具体产品类和对应的具体工厂类即可,无需修改现有代码,提高了系统的可维护性和扩展性。

优点

  1. 封装性好:客户端无需知道产品的具体创建细节,只需要知道产品的接口。

  2. 扩展性强:新增产品时,只需要添加相应的产品类和工厂类,原有代码无需修改。

  3. 遵循开闭原则:对扩展开放,对修改封闭,增加了系统的灵活性和可维护性。

缺点

  1. 类的膨胀:随着产品类的增多,需要对应的工厂类也随之增加,这可能导致系统中类的数量急剧上升。

  2. 抽象层次提升:引入抽象工厂和产品接口增加了系统的抽象层次,对于一些小型项目可能显得过于复杂。

应用场景

  • 当一个系统需要动态决定创建哪种产品类的实例时。

  • 当一个类无法预料要创建哪种类的对象,或者需要由子类来指定创建的对象时。

  • 当一个类希望由它的子类来指定它所创建的对象时。

示例代码(Java)

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

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

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

// 工厂接口
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 Client {

    public static void main(String[ ] args) {

        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.operation(); // 输出: ConcreteProductA的操作

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.operation(); // 输出: ConcreteProductB的操作
    }
}

通过上述示例,可以看到工厂方法模式如何解耦了对象的创建过程,使得系统更易于维护和扩展。

0

评论区