⼯⼚模式是⼀种⾮常常⽤的创建型设计模式,其提供了创建对象的最佳⽅式。在创建对象时,不会对客户端暴露对象的创建逻辑,⽽是通过使⽤共同的接⼝来创建对象。其⽤来封装和管理类的创建,本质是对获取对象过程的抽象。
⼀般情况下,⼯⼚模式分为三种更加细分的类型:简单⼯⼚、⼯⼚⽅法和抽象⼯⼚。
假设我们有一个应用,它可以处理不同类型的文档。每种文档类型都有其特定的处理方式。我们将使用工厂模式来创建不同类型的文档处理器。
- 定义抽象产品
public interface Document {
void process();
}
- 实现具体产品
public class WordDocument implements Document {
@Override
public void process() {
System.out.println("Processing Word document...");
}
}
public class PdfDocument implements Document {
@Override
public void process() {
System.out.println("Processing PDF document...");
}
}
- 创建简单工厂
public class DocumentFactory {
// 使用 getDocument 方法获取不同类型的文档对象
public static Document getDocument(String docType) {
if (docType == null) {
return null;
}
if (docType.equalsIgnoreCase("WORD")) {
return new WordDocument();
} else if (docType.equalsIgnoreCase("PDF")) {
return new PdfDocument();
}
return null;
}
}
- 最后,客户端代码使用工厂来获取具体的文档对象,并处理它:
public class FactoryPatternDemo {
public static void main(String[] args) {
Document document1 = DocumentFactory.getDocument("WORD");
document1.process();
Document document2 = DocumentFactory.getDocument("PDF");
document2.process();
}
}
在这个例子中,DocumentFactory是一个简单工厂,它根据传入的字符串参数决定创建哪种类型的文档对象。客户端代码不需要知道具体的文档处理逻辑,只需要通过工厂接口请求一个文档对象,然后调用其process方法。
这里提出一个问题?
如果现在又有新产品进来,实现完产品后还要到简单工厂加入对应的逻辑代码,如果有很多新产品,那么这样的处理是不是太麻烦?应该怎么解决呢?
⼯⼚类集合了所有产品的创建逻辑,职责过重,同时新增⼀个产品就需要在原⼯⼚类内部添加⼀个分⽀,违反了开闭原则。并且若是有多个判断条件共同决定创建对象,则后期修改会越来越复杂。因此引入抽象工厂,由于篇幅问题,见下一节。千万不要点