网站首页 > java教程 正文
工厂模式是一种创建型设计模式,它的目的是为客户端创建对象提供一个统一的接口,隐藏对象的创建细节并将其委托给一个子类来处理。在工厂模式中,我们不直接调用构造函数来创建对象,而是调用工厂方法来创建对象。
一、原理
工厂模式的主要目的是将对象的创建与使用相分离,并封装对象创建过程中的细节,从而使得代码更具有扩展性和灵活性。
在 Java 中,工厂模式通常由一个工厂类或者一组工厂类来实现。这些工厂类负责创建某个产品或产品族的对象,而客户端只需要调用工厂类的方法即可获取所需的对象。
二、使用场景
通常情况下,工厂模式适用于以下场景:
1、多个子类共同实现一个接口时:当多个子类具有相同的方法,但是这些子类需要根据不同的情况返回不同的实例时,可以采用工厂模式。在这种情况下,工厂类可以根据特定的条件,返回不同的实例。
2、对象的创建过程比较复杂时:当对象的创建过程比较复杂,需要经过多个步骤时,可以采用工厂模式。在这种情况下,工厂类可以将对象的创建过程封装起来,从而提高了代码的可读性和可维护性。
3、需要动态地指定创建哪个实例时:当需要根据运行时的情况来决定创建哪个实例时,可以采用工厂模式。在这种情况下,工厂类可以根据不同的条件,返回不同的实例。
4、降低代码的耦合度时:当需要降低代码的耦合度时,可以采用工厂模式。在这种情况下,工厂类可以负责对象的创建和销毁,从而降低了不同模块之间的耦合度。
三、工厂模式的分类
在 Java 中,工厂模式一般可以分为三种,它们分别是:
1、简单工厂模式(Simple Factory Pattern):也称为静态工厂模式,将对象的创建过程封装在一个静态方法中,客户端通过传入相应的参数来选择要创建的对象。这种模式比较简单易用,但是也存在一定的局限性,例如不支持拓展和维护。
2、工厂方法模式(Factory Method Pattern):定义一个抽象的工厂类,具体的对象创建过程由其子类实现。客户端仅需要知道抽象工厂类和相应的产品接口即可,而具体的对象实现细节被封装在不同的子类中。这种模式具有较好的灵活性和可拓展性。
3、抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,其中每个工厂类负责创建一类产品。与工厂方法模式相比,抽象工厂模式可以同时创建多个产品系列,具有更高的抽象层次和更高的复杂度。
除了这三种基本的工厂模式之外,还有一些变种和衍生模式,例如工厂模式和单例模式的结合、工厂模式和策略模式的结合等。根据具体的业务需求和系统设计,我们可以选择不同类型的工厂模式来实现相应的功能。
四、简单工厂模式示例代码
我们将创建一个形状(Shape)抽象类和三个具体形状(Circle、Rectangle、Square)类,以演示简单工厂模式的用法。Shape是一个抽象类,它的子类可以以不同方式实现draw方法来画出不同形状的图形。ShapeFactory是一个工厂类,它根据参数来选择要实例化的对象。
首先,定义Shape抽象类。
public abstract class Shape {
public abstract void draw();
}
随后,实现具体形状类Circle、Rectangle、Square。
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle.draw");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle.draw");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square.draw");
}
}
创建工厂类ShapeFactory,使用简单工厂模式,实现 getShape() 的静态方法,通过传入参数,返回不同的 Shape 实现对象实例。
public class ShapeFactory {
public static Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
测试简单工厂模式代码。
public class FactoryPatternDemo {
public static void main(String[] args) {
// 获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = ShapeFactory.getShape("CIRCLE");
shape1.draw();
// 获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = ShapeFactory.getShape("RECTANGLE");
shape2.draw();
// 获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = ShapeFactory.getShape("SQUARE");
shape3.draw();
}
}
五、工厂方法模式示例代码
还是上面的示例中的 Shape抽象类 和 实现具体形状类Circle、Rectangle、Square。不同的是这次我们使用工厂方法模式,创建抽象工厂类ShapeFactory。
public abstract class ShapeFactory {
public abstract Shape getShape();
}
创建具体工厂类CircleFactory、RectangleFactory、SquareFactory。
public class CircleFactory extends ShapeFactory {
@Override
public Shape getShape() {
return new Circle();
}
}
public class RectangleFactory extends ShapeFactory {
@Override
public Shape getShape() {
return new Rectangle();
}
}
public class SquareFactory extends ShapeFactory {
@Override
public Shape getShape() {
return new Square();
}
}
ShapeFactory是一个抽象工厂类,它负责定义创建Shape对象的接口。CircleFactory、RectangleFactory、SquareFactory是具体工厂类,它们分别返回Circle、Rectangle、Square对象。
六、抽象工厂模式示例代码
在本示例代码中,我们将创建两个产品族:电脑和手机,每个产品族都有两个产品:台式电脑和笔记本电脑,手机和平板电脑。首先定义抽象产品类 Computer 和 Phone:
public interface Computer {
// 打印电脑信息
void printComputerInfo();
}
public interface Phone {
// 打印手机信息
void printPhoneInfo();
}
接下来定义具体产品类 DesktopComputer、LaptopComputer、SmartPhone 和 Tablet:
public class DesktopComputer implements Computer {
@Override
public void printComputerInfo() {
System.out.println("Desktop Computer");
}
}
public class LaptopComputer implements Computer {
@Override
public void printComputerInfo() {
System.out.println("Laptop Computer");
}
}
public class SmartPhone implements Phone {
@Override
public void printPhoneInfo() {
System.out.println("Smart Phone");
}
}
public class Tablet implements Phone {
@Override
public void printPhoneInfo() {
System.out.println("Tablet");
}
}
然后定义抽象工厂类 AbstractFactory:
public abstract class AbstractFactory {
// 创建电脑
public abstract Computer createComputer();
// 创建手机
public abstract Phone createPhone();
}
接下来定义具体工厂类 ComputerFactory 和 PhoneFactory:
public class ComputerFactory extends AbstractFactory {
@Override
public Computer createComputer() {
return new DesktopComputer();
}
@Override
public Phone createPhone() {
return new SmartPhone();
}
}
public class PhoneFactory extends AbstractFactory {
@Override
public Computer createComputer() {
return new LaptopComputer();
}
@Override
public Phone createPhone() {
return new Tablet();
}
}
最后,我们可以通过创建一个具体工厂类的实例来访问工厂方法,并创建一系列相关的产品:
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
AbstractFactory computerFactory = new ComputerFactory();
Computer desktopComputer = computerFactory.createComputer();
Phone smartPhone = computerFactory.createPhone();
desktopComputer.printComputerInfo();
smartPhone.printPhoneInfo();
AbstractFactory phoneFactory = new PhoneFactory();
Computer laptopComputer = phoneFactory.createComputer();
Phone tablet = phoneFactory.createPhone();
laptopComputer.printComputerInfo();
tablet.printPhoneInfo();
}
}
输出结果为:
Desktop Computer
Smart Phone
Laptop Computer
Tablet
使用抽象工厂模式可以轻松创建一系列相关或相互依赖的对象,而无需指定其具体类。
七、SpringBoot中的工厂模式
SpringBoot 源代码中有很多使用工厂模式的例子,其中最经典的就是 BeanFactory 和ApplicationContext。这两个类都是Spring框架创建和管理bean实例的核心,它们使用了工厂模式来实现。
BeanFactory是Spring框架中最基本的bean工厂接口,它定义了Spring容器如何创建、配置和管理bean实例。在BeanFactory中,我们可以使用getBean方法根据Bean名称或类型来获取一个bean实例,如下所示:
public interface BeanFactory {
......
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
......
}
在 BeanFactory 的实现中,通常会使用工厂模式来创建和管理bean实例。例如,Spring 提供了一个名为 DefaultListableBeanFactory 的默认实现,它在初始化时会读取配置文件中的 bean 定义信息,并将这些信息保存到内部的 BeanDefinitionMap 中。之后,当用户调用 getBean() 方法时,它会根据Bean名称或类型从 BeanDefinitionMap 中获取bean定义信息,并使用工厂模式创建相应的 bean 实例。
八、总结
工厂模式是一种常用的设计模式,它可以将对象的创建与使用分离,提高代码的重用性和可维护性。在 Java 编程中,工厂模式被广泛应用于各种场景,如数据库连接池、日志记录器等。通过合理应用工厂模式,我们可以使代码更加灵活和易于扩展。
对于本文中的内容,不知道你有没有什么看法,欢迎在评论区里留言。如果你对我的文章内容感兴趣,欢迎点击关注,谢谢支持![谢谢][谢谢][谢谢]
猜你喜欢
- 2024-10-23 Java的简单工厂模式(java简单工厂模式实验总结)
- 2024-10-23 Java开发篇——设计模式(3)面试被问工厂模式?不要怕看这里
- 2024-10-23 架构师成长之路:Java设计模式之工厂模式
- 2024-10-23 Java——工厂方法模式(java的工厂模式是什么意思啊)
- 2024-10-23 Java编程细节——设计模式之工厂模式
- 2024-10-23 Java之工厂方法(Factory Method)(java工厂模式的应用场景)
- 2024-10-23 Java工厂设计模式学习笔记(详细总结)
- 2024-10-23 教你轻松学Java开发23种设计模式 --工厂设计模式
- 2024-10-23 java设计模式-创建者模式-工厂模式
- 2024-10-23 设计模式——工厂方法模式(工厂设计模式的优点)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)