作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。
主打方向:Vue、SpringBoot、微信小程序
本文讲解了 Java 设计模式中的工厂方法模式,并给出了样例代码,工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装在子类中的方式。
一、什么是工厂方法模式
工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装在子类中的方式,在工厂方法模式中父类定义了一个创建对象的接口,但具体的对象的创建由子类决定。这样,将对象的实例化过程延迟到子类中,使得子类可以根据需要创建具体的对象。
在工厂方法模式中,通常会有一个抽象工厂类和多个具体工厂类。抽象工厂类中定义了一个抽象的工厂方法,该方法返回一个抽象产品类的实例。具体工厂类继承抽象工厂类,并实现工厂方法,返回具体的产品类的实例。
工厂方法模式的优点是将对象的创建和使用解耦,增加了系统的灵活性和可扩展性。通过引入抽象工厂类和具体工厂类,可以方便地增加新的产品类和相应的工厂类,符合开闭原则。
工厂方法模式适用于以下 3 3 3 种情况,请同学们认真学习。
- 当一个类不知道它所需要的对象的确切类时。
- 当一个类希望由子类来指定所创建的对象时。
- 当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时。
总的来说,工厂方法模式通过将对象的创建延迟到子类来实现灵活的对象创建,提高了系统的可扩展性和复用性。
二、工厂方法模式有哪些
2.1 简单工厂模式
简单工厂模式:由一个工厂类通过静态方法创建对象,根据传入的参数类型来决定创建哪个具体的产品对象,样例代码如下。
// 抽象产品类
interface Product {
void operation();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 简单工厂类
class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
return null;
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.operation();
Product productB = SimpleFactory.createProduct("B");
productB.operation();
}
}
2.2 工厂方法模式
工厂方法模式:每个具体产品都对应一个具体工厂,抽象工厂类定义工厂方法,由子类实现具体的工厂方法来创建产品对象,样例代码如下。
// 抽象产品类
interface Product {
void operation();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 抽象工厂类
interface Factory {
Product createProduct();
}
// 具体工厂类A
class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂类B
class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.operation();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.operation();
}
}
以上是两种常见的工厂方法模式的示例代码,分别展示了简单工厂模式和工厂方法模式的实现方式,请同学们根据实际需求选择合适的方式来实现工厂方法模式。
三、工厂方法模式的应用场景
工厂方法模式适用于以下 4 4 4 种场景:
- 当一个类不知道它所需要的对象的确切类时,可以使用工厂方法模式。例如,一个图形绘制程序需要根据用户的选择创建不同类型的图形对象,但是在编译时无法确定具体的图形类型。
- 当一个类希望由子类来指定所创建的对象时,可以使用工厂方法模式。例如,一个抽象类定义了一个抽象方法,让子类来实现该方法并创建具体的对象。
- 当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时,可以使用工厂方法模式。例如,一个日志记录器类需要根据当前的环境选择使用文件日志记录器、数据库日志记录器还是网络日志记录器。
- 当需要通过扩展来添加新的产品类,而不需要修改现有的代码时,可以使用工厂方法模式。例如,一个电子商务平台需要不断添加新的支付方式,可以通过添加新的支付工厂类来实现。
总的来说,工厂方法模式适用于需要根据不同的条件创建不同类型的对象,并且希望将对象的创建与具体使用对象的类解耦的场景。它提供了一种灵活的对象创建方式,增加了系统的可扩展性和复用性。
四、工厂方法模式面试题
- 什么是工厂方法模式?
- 工厂方法模式和简单工厂模式有什么区别?
- 工厂方法模式的角色有哪些?
- 工厂方法模式的优点是什么?
- 工厂方法模式的缺点是什么?
- 工厂方法模式在 Java 中如何实现?
- 工厂方法模式适用于哪些场景?
- 工厂方法模式和抽象工厂模式有什么区别?
- 简述使用工厂方法模式实现一个日志记录器的例子。
- 工厂方法模式和单例模式可以结合使用吗?
五、总结
本文讲解了 Java 设计模式中的工厂方法模式,并给出了样例代码,在下一篇博客中,将讲解 Java 抽象工厂模式。