聊聊设计模式——简单工厂模式

目录

1.简单工厂模式定义

2.优点

3.缺点

4.简单工厂模式结构说明

5.工作流程

6.示例

7.适用场景

8.本质

9.涉及到的设计原则

10.相关设计模式

11.开源框架中的应用

简单工厂模式定义

提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。

聊聊设计模式——简单工厂模式_第1张图片

优点
  1. 简单:实现简单,适用于创建单一类型的对象。

  2. 集中控制:可以通过工厂类集中控制对象的创建,方便管理和维护。

  3. 隐藏细节:客户端不需要知道具体的对象创建细节,只需要通过工厂类来获取对象。

缺点
  1. 不满足开闭原则:如果需要添加新的产品,就需要修改工厂类,违反了开闭原则(对扩展开放,对修改关闭)。

  2. 不支持多个工厂类:每个工厂方法通常只能创建一种类型的对象,不支持创建多种不同类型的对象。

  3. 工厂类职责过重:随着产品类型的增加,工厂类的职责可能会变得过重,影响代码的可维护性。

 简单工厂模式结构说明:
  1. 工厂类(Factory):工厂类是简单工厂模式的核心部分,负责根据客户端的需求创建具体的产品对象。工厂类通常包含一个或多个工厂方法,这些方法根据不同的参数或条件来创建不同的产品对象。

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

  3. 具体产品类(Concrete Product):具体产品类是抽象产品类的具体实现,实现了抽象产品类定义的接口。工厂类的工厂方法会返回一个具体产品类的实例。

工作流程:
  1. 客户端(Client)通过向工厂类请求对象来创建产品对象,而不是直接实例化产品类。

  2. 工厂类根据客户端的请求,选择合适的工厂方法来创建具体的产品对象。

  3. 工厂方法创建产品对象并将其返回给客户端。

  4. 客户端使用产品对象进行操作。

示例:

定义一个抽象产品类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("我是铁门...");
    }
}

定义简单工厂类 ProductFactory ,它包含一个静态方法 createProduct(String type) ,根据传入的参数 type 创建具体产品对象并返回:

/*
简单工厂的工厂类:负责所有产品的创建,在新增产品的情况下需要修改工厂类,违背了开闭原则
 */
public class ProductFactory {
    public static Door createProduct(String type){
        switch (type){
            case "wood":
                return new WoodDoor();
            case "iron":
                return new IronDoor();
            default:
                return null;
        }
    }
}

在客户端代码中,通过简单工厂类 ProductFactory 创建具体产品对象,并调用其方法:

public class SimpleFactoryClient {
    public static void main(String[] args) {
        ProductFactory factory = new ProductFactory();
        factory.createProduct("wood").show();
        factory.createProduct("iron").show();
        try {
            factory.createProduct("gold").show();
        } catch (NullPointerException e){
            System.out.println("没有这类产品,具体的堆栈信息如下:");
            e.printStackTrace();
        }
    }
}

在上述示例中,工厂类 ProductFactory 根据客户端的请求来创建具体的产品对象,客户端只需通过工厂类来获取对象,而不需要了解对象的创建细节。这种方式实现了对象的创建和使用的分离,使代码更具灵活性。

适用场景:
  1. 当需要根据一定条件创建不同类型的对象时,可以使用简单工厂模式。例如,根据用户的选择创建不同类型的图形对象(圆形、矩形等)。

  2. 当需要将对象的创建过程封装在一个单一的工厂类中,以降低客户端与具体对象的耦合度。

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

本质:

        简单工厂模式的本质是将对象的创建过程封装起来,提供一个统一的接口,通过工厂类来创建对象,从而降低了客户端与具体对象之间的耦合度。     

涉及到的设计原则:
  1. 单一职责原则(Single Responsibility Principle):工厂类的主要职责是创建对象,保持了类的单一职责。

  2. 开闭原则(Open/Closed Principle):通过添加新的产品类型,可以扩展工厂类的功能,符合对扩展开放。但是添加新的产品类型,就需要修改工厂类,违反了对修改关闭。

相关设计模式:
  1. 工厂方法模式(Factory Method Pattern):工厂方法模式是简单工厂模式的扩展,它将对象的创建过程延迟到子类中,支持创建一组相关的对象。

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

开源框架中的应用:
  1. Java标准库:Java标准库中的java.text.DateFormat类提供了一个静态工厂方法getInstance(),根据不同的参数创建不同的日期格式化对象,例如SimpleDateFormat,从而使日期格式化对象的创建过程对客户端透明。

  2. Log4j:Log4j是一个流行的Java日志记录库,它使用简单工厂模式来创建不同类型的日志记录器,如ConsoleAppenderFileAppender

  3. 数据库连接池:许多数据库连接池实现使用简单工厂模式来创建数据库连接对象,根据不同的配置信息来创建不同类型的数据库连接。

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

你可能感兴趣的:(设计模式,设计模式,简单工厂模式)