聊聊设计模式——工厂方法模式

目录

1.工厂方法模式定义

2.优点

3.缺点

4.工厂方法模式结构说明

5.工作流程

6.示例

7.应用场景

8.本质

9.涉及的设计原则

10.相关设计模式

11.开源框架中的应用:


工厂方法模式定义:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

聊聊设计模式——工厂方法模式_第1张图片

优点
  1. 满足开闭原则:工厂方法模式支持扩展,通过创建不同的具体工厂类来添加新的产品,不需要修改现有代码。

  2. 支持多态:客户端可以通过抽象工厂类和产品接口进行编程,从而实现多态。

  3. 维护性好:每个产品的创建都由具体工厂类负责,代码结构清晰,易于维护。

缺点
  1. 增加了类的数量:引入了额外的工厂类,增加了类的数量,可能导致类的层次结构较深。

  2. 复杂性增加:对于简单的场景,工厂方法模式可能会显得过于复杂。

工厂方法模式结构说明:
  1. 抽象工厂接口(Creator):抽象工厂接口定义了一个工厂方法(FactoryMethod),该方法用于创建产品对象。这个接口可以是一个抽象类或接口。

  2. 具体工厂类(ConcreteCreator):具体工厂类是抽象工厂接口的具体实现,它实现了工厂方法,用于创建具体的产品对象。

  3. 抽象产品接口(Product):抽象产品接口定义了产品对象的通用接口,客户端通过该接口与具体产品对象进行交互。这个接口可以是一个抽象类或接口。

  4. 具体产品类(Concrete Product):具体产品类是抽象产品接口的具体实现,实现了抽象产品接口定义的接口。

工作流程:
  1. 客户端(Client)通过调用具体工厂类的工厂方法来创建产品对象,而不是直接实例化产品类。

  2. 具体工厂类根据客户端的请求,创建并返回具体产品对象。

  3. 客户端使用具体产品对象进行操作。

示例:

定义一个抽象产品类Door,它包含一个抽象方法show() ,表示产品的展示:

// 抽象产品类
public abstract class Door {
    public abstract void show();
}

定义具体产品类WoodDoor和IronDoor,它们继承自抽象产品类Door,并实现了抽象方法show() :

public class WoodDoor extends Door {
    @Override
    public void show() {
        System.out.println("我是木门...");
    }
}
// 具体的产品类 - 铁门
public class IronDoor extends Door {
    @Override
    public void show() {
        System.out.println("我是铁门...");
    }
}

定义一个抽象工厂类Creator,它包含一个抽象方法createDoor() ,表示创建产品:

// 抽象工厂类
public abstract class Creator {
    public abstract Door createDoor();
}

定义具体工厂类WoodFactory和IronFactory,它们继承自抽象工厂类Creator,并实现了抽象方法createDoor() :

// 具体工厂类 - 木材工厂
public class WoodFactory  extends Creator {
    @Override
    public Door createDoor() {
        return new WoodDoor();
    }
}
// 具体工厂类 - 钢铁工厂
public class IronFactory extends Creator {
    @Override
    public Door createDoor() {
        return new IronDoor();
    }
}

在客户端代码中,通过对应工厂类创建具体产品对象:

/*
工厂方法模式:将产品的细节延迟实现在工厂子类中,对扩展友好,符合开闭原则。
 */
public class FactoryMethodClient {
    public static void main(String[] args) {
        // 生产木门
        Creator creator = new WoodFactory();
        Door door = creator.createDoor();
        door.show();

        // 生产铁门
        creator = new IronFactory();
        door = creator.createDoor();
        door.show();
    }
}
应用场景:
  1. 当一个类无法预知需要创建哪个具体对象时,可以使用工厂方法模式。这允许子类决定创建的对象类型,从而实现对象创建的多态性。

  2. 当需要在不同的情况下创建不同类型的对象时,工厂方法模式可以根据不同的条件创建不同的具体对象。

  3. 当希望通过工厂类来集中管理和维护对象的创建,方便后续的修改和扩展。

本质:

        工厂方法模式的本质是将对象的创建过程延迟到子类中,以达到客户端与具体对象之间解耦的目的,同时支持多态性。

涉及的设计原则:
  1. 开闭原则(Open/Closed Principle):通过创建不同的具体工厂类,可以扩展工厂模式的功能,而不需要修改现有的客户端代码,符合开闭原则。

  2. 依赖倒置原则(Dependency Inversion Principle):工厂方法模式通过抽象工厂接口和抽象产品接口,实现了高层模块(客户端)不依赖于底层模块(具体产品),符合依赖倒置原则。

相关设计模式:
  1. 简单工厂模式(Simple Factory Pattern):简单工厂模式是工厂方法模式的一种特例,它通常使用一个静态方法来创建对象,而工厂方法模式将对象的创建延迟到子类中。

  2. 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也用于创建一组相关的对象,但它将工厂和产品的组合进行抽象,支持创建多个不同产品族的对象。

开源框架中的应用:
  1. ava标准库:Java标准库中的java.util.Calendar类包含一个getInstance()工厂方法,根据不同的条件(如时区)创建不同的日历对象,例如GregorianCalendar

  2. Spring框架:Spring框架中的BeanFactory接口和其具体实现类,如XmlBeanFactoryDefaultListableBeanFactory,使用工厂方法来创建和管理Bean对象。客户端通过BeanFactory接口来获取具体的Bean对象,实现了对象创建和使用的解耦。

  3. JUnit框架:JUnit测试框架中的TestSuite类使用工厂方法来创建测试套件(suite),根据不同的条件选择不同的测试用例集合。

这些示例中,工厂方法模式帮助框架提供了一种灵活的方式来创建对象,同时封装了对象的具体创建细节,从而使客户端代码更加清晰和可维护。

你可能感兴趣的:(设计模式,设计模式,工厂方法模式,java)