目录
1.简单工厂模式定义
2.优点
3.缺点
5.工作流程
6.示例
7.适用场景
8.本质
9.涉及到的设计原则
10.相关设计模式
11.开源框架中的应用
简单工厂模式定义:
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
优点:
-
简单:实现简单,适用于创建单一类型的对象。
-
集中控制:可以通过工厂类集中控制对象的创建,方便管理和维护。
-
隐藏细节:客户端不需要知道具体的对象创建细节,只需要通过工厂类来获取对象。
缺点:
-
不满足开闭原则:如果需要添加新的产品,就需要修改工厂类,违反了开闭原则(对扩展开放,对修改关闭)。
-
不支持多个工厂类:每个工厂方法通常只能创建一种类型的对象,不支持创建多种不同类型的对象。
-
工厂类职责过重:随着产品类型的增加,工厂类的职责可能会变得过重,影响代码的可维护性。
简单工厂模式结构说明:
-
工厂类(Factory):工厂类是简单工厂模式的核心部分,负责根据客户端的需求创建具体的产品对象。工厂类通常包含一个或多个工厂方法,这些方法根据不同的参数或条件来创建不同的产品对象。
-
抽象产品类(Product):抽象产品类定义了产品对象的通用接口,客户端通过该接口与具体产品对象进行交互。通常,抽象产品类是一个接口或抽象类。
-
具体产品类(Concrete Product):具体产品类是抽象产品类的具体实现,实现了抽象产品类定义的接口。工厂类的工厂方法会返回一个具体产品类的实例。
工作流程:
-
客户端(Client)通过向工厂类请求对象来创建产品对象,而不是直接实例化产品类。
-
工厂类根据客户端的请求,选择合适的工厂方法来创建具体的产品对象。
-
工厂方法创建产品对象并将其返回给客户端。
-
客户端使用产品对象进行操作。
示例:
定义一个抽象产品类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
根据客户端的请求来创建具体的产品对象,客户端只需通过工厂类来获取对象,而不需要了解对象的创建细节。这种方式实现了对象的创建和使用的分离,使代码更具灵活性。
适用场景:
-
当需要根据一定条件创建不同类型的对象时,可以使用简单工厂模式。例如,根据用户的选择创建不同类型的图形对象(圆形、矩形等)。
-
当需要将对象的创建过程封装在一个单一的工厂类中,以降低客户端与具体对象的耦合度。
-
当希望通过工厂类来集中管理和维护对象的创建,方便后续的修改和扩展。
本质:
简单工厂模式的本质是将对象的创建过程封装起来,提供一个统一的接口,通过工厂类来创建对象,从而降低了客户端与具体对象之间的耦合度。
涉及到的设计原则:
-
单一职责原则(Single Responsibility Principle):工厂类的主要职责是创建对象,保持了类的单一职责。
-
开闭原则(Open/Closed Principle):通过添加新的产品类型,可以扩展工厂类的功能,符合对扩展开放。但是添加新的产品类型,就需要修改工厂类,违反了对修改关闭。
相关设计模式:
-
工厂方法模式(Factory Method Pattern):工厂方法模式是简单工厂模式的扩展,它将对象的创建过程延迟到子类中,支持创建一组相关的对象。
-
抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也用于创建一组相关的对象,但它将工厂和产品的组合进行抽象,支持创建多个不同产品族的对象。
开源框架中的应用:
-
Java标准库:Java标准库中的
java.text.DateFormat
类提供了一个静态工厂方法getInstance()
,根据不同的参数创建不同的日期格式化对象,例如SimpleDateFormat
,从而使日期格式化对象的创建过程对客户端透明。 -
Log4j:Log4j是一个流行的Java日志记录库,它使用简单工厂模式来创建不同类型的日志记录器,如
ConsoleAppender
和FileAppender
。 -
数据库连接池:许多数据库连接池实现使用简单工厂模式来创建数据库连接对象,根据不同的配置信息来创建不同类型的数据库连接。
这些示例中,简单工厂模式帮助框架提供了一种灵活的方式来创建对象,同时封装了对象的具体创建细节,从而使客户端代码更加清晰和可维护。