创建型模式 简单工厂、工厂方法、抽象工厂
本文最后更新于:2024-03-27 20:01 星期三
工厂模式
简单工厂(静态工厂)
简单工厂并不归属于Gof设计模式
- 定义:简单工厂模式通过一个工厂类来创建产品类的实例。客户端只需提供给工厂类一个参数,工厂类根据这个参数决定创建哪种产品类的实例。
- 特点:简单工厂模式将对象的创建和使用解耦,客户端只需知道所需产品的类型即可,无需关心具体实现细节。
- 关注点:简单工厂模式关注于将对象的创建过程封装在一个工厂类中。它的主要目标是将实例化对象的过程从客户端代码中分离出来,使得客户端不需要知道具体产品的实现细节,只需与工厂进行交互即可获得所需的对象实例。
源码应用
Logback的 LoggerFactory类
Java JDK中的
Calendar
类的getInstance()
方法就是一个简单工厂模式的应用。它根据不同的参数(如Calendar.YEAR
、Calendar.MONTH
等)返回不同的Calendar
子类实例。Spring框架中的
BeanFactory
接口就是一个简单工厂模式的应用。它通过getBean()
方法根据名称或类型返回不同的Bean实例。
优缺点
优点: 构造简单,使用简单,根据传参方便的创造出对象
缺点: 需要创建的对象太多时,造成工厂类臃肿
- 优点:
- 实现简单,易于理解和使用。
- 将对象的创建过程集中在一个工厂类中,便于管理和维护。
- 客户端免除了直接创建对象的责任,降低了耦合度。
- 缺点:
- 违反了开放-封闭原则,每次新增产品都需要修改工厂类,扩展性较差。
- 工厂类的职责过重,可能会导致工厂类代码膨胀。
工厂方法
相比简单工厂,不再有一个工厂类负责,而是由工厂类的子类实现具体的工厂类。增加工厂通过实现工厂父类扩展,而不是修改工厂类本身。(符合开闭原则)
- 定义:方法工厂模式定义了一个创建对象的接口,但将具体的创建工作延迟到了子类中来完成。这样每个子类都可以决定要实例化哪个类。
- 特点:方法工厂模式通过继承来实现不同产品的创建,每个子类可以根据需要提供自己特定的实现。
- 关注点:工厂方法模式关注于定义一个用于创建对象的接口,但将具体的创建工作延迟到子类中。这样,每个子类都可以决定要实例化哪个类,从而使得系统更加灵活。工厂方法模式注重于通过继承来实现不同产品的创建,每个子类可以根据需要提供自己特定的实现。
源码应用
Java JDK中的
java.util.concurrent.Executors
类就使用了工厂方法模式来创建不同类型的线程池。例如,newFixedThreadPool()
、newCachedThreadPool()
等方法都是工厂方法,它们返回了不同配置的线程池实例。Spring框架中的
BeanFactory
接口的扩展AbstractBeanFactory
和DefaultListableBeanFactory
等类也使用了工厂方法模式来创建不同类型的Bean实例。Logback
优缺点
优点:方便扩展、对高层解耦仅需要知道抽象类
缺点:类个数太多,业务的抽象剥离比较困难。相比抽象工厂过于单一
优点:
- 符合开放-封闭原则,添加新产品时无需修改现有代码,只需添加新的具体工厂类即可。
- 客户端只需要知道所需产品的具体工厂即可,不需要关心具体产品的实现细节,降低了耦合度。
缺点:
- 每次新增产品都需要编写新的具体工厂类,类的数量可能会增多,增加了系统的复杂度。
- 当产品种类较多时,会导致工厂方法模式产生大量的具体工厂类。
抽象工厂
- 工厂方法模式通常用于创建单个对象,而抽象工厂模式则通常用于创建一组相关的对象。工厂方法模式也可以用于创建一系列相关的对象,只是在实际应用中更常用于创建单个对象。
- 工厂方法模式:通常用于创建单个对象,每个具体工厂类只负责创建一种产品。但是,如果需要创建一系列相关的对象,也可以在一个工厂接口中定义多个工厂方法,每个工厂方法负责创建一种产品。
- 抽象工厂模式:主要用于创建一组相关或依赖的对象,每个具体工厂类通常负责创建一整套相关的产品。因此,抽象工厂模式更适合需要一次性创建多个相关对象的情况。
- 需要知道什么是产品族和产品等级结构。例如 电脑、手机、平板都归属与电子产品的产品族,而不同品牌的电脑、手机、平板构成了各自的等级结构。
定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这样客户端可以通过该接口创建出一系列的产品。
特点:抽象工厂模式适用于需要一次性创建一系列相关对象的情况,通常用于构建一整套产品。
关注点:抽象工厂模式关注于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这样客户端可以通过该接口创建出一系列的产品。抽象工厂模式适用于需要一次性创建一系列相关对象的情况,通常用于构建一整套产品。其关注点在于创建一族产品,这些产品之间有相互关系或依赖。
源码应用
Spring的 BeanFactory的子类主要有 ClassPathXml Application Context 、XmlWeb Application Context、StaticWebApplicationContext、StaticPortlet Application Context、Generic Application Context和Static Application Context。在Spring中DefaultListableBeanFactory实现了所有工厂的公共逻辑
Java JDK中的
java.sql.Connection
接口就是一个抽象工厂模式的应用。不同的数据库驱动提供了不同的Connection
实现,这些实现类由具体的数据库厂商实现,而应用程序无需关心具体的实现细节。Spring框架中的
AbstractApplicationContext
等类也使用了抽象工厂模式。它们定义了创建应用上下文的抽象方法,具体的实现由不同的子类(如ClassPathXmlApplicationContext
、AnnotationConfigApplicationContext
等)提供。
优缺点
- 优点:
- 符合开放-封闭原则,添加新产品族时只需增加新的具体工厂类,不需要修改现有代码。
- 提供了一种产品族的概念,可以在不破坏封装性的前提下实现对产品族的配置。
- 缺点:
- 扩展新产品族时比较复杂,需要修改抽象工厂接口及所有具体工厂类,不够灵活。
- 增加了系统的抽象性和复杂度,使得系统更加庞大。