工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个创建对象的接口,但将实际创建对象的工作推迟到子类中进行。这使得在不指定具体类的情况下创建对象成为可能,增加了代码的灵活性和可扩展性。
hmmm生硬的解释可能比较难以理解,换句话说就是把各个子类需要特殊实现的方法和属性分离开,公用的方法和属性则仍然放在Factory里。且当需要增加子类时不需要去修改已有代码。
目的和应用场景
工厂方法模式主要用于以下情况:
- 当创建对象的逻辑比较复杂时,可以将其封装在一个专门的工厂里。
- 当需要对创建的对象进行后处理,或者需要使用不同的方法或参数来创建对象时。
- 当需要增加程序的灵活性和可扩展性,使得新增加的产品类不需要修改已有代码,或者最小化修改。
如何实现
工厂方法模式通常涉及以下几个角色:
-
产品(Product):定义工厂方法所创建的对象的接口。
-
具体产品(Concrete Product):实现产品接口的具体类。
-
创建者(Creator):声明工厂方法,返回一个产品对象。创建者也可以提供工厂方法的默认实现,也就是共通的方法和属性。
-
具体创建者(Concrete Creator):重写工厂方法以返回一个具体产品实例。
示例
个软件系统用于管理不同类型的文档。在这个系统中,我们会有一个文档的基类以及几个派生类,分别代表不同类型的文档。通过使用Factory Method模式,我们能够根据需要在运行时创建不同类型的文档实例。
- 定义产品接口:首先定义一个文档(Document)的接口或者一个抽象类,确定文档应有的基本行为。
- 创建具体产品类:然后为每种类型的文档创建具体的类,如
WordDocument
和PdfDocument
,它们都实现Document接口或者继承自一个抽象文档类。
- 定义创建者抽象类:定义一个创建者类(Creator),其中包含一个抽象的Factory Method,该方法返回一个文档对象。
- 创建具体创建者类:为每种文档类型创建一个创建者子类(如
WordDocumentCreator
和PdfDocumentCreator
),并重写Factory Method以生成相应类型的文档。
示例代码
以下是使用C#实现上述概念的代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// 步骤1: 定义产品接口
public abstract class Document
{
public abstract void Open();
public abstract void Close();
}
// 步骤2: 创建具体产品类
public class WordDocument : Document
{
public override void Open() => Console.WriteLine("Word document opened.");
public override void Close() => Console.WriteLine("Word document closed.");
}
public class PdfDocument : Document
{
public override void Open() => Console.WriteLine("PDF document opened.");
public override void Close() => Console.WriteLine("PDF document closed.");
}
// 步骤3: 定义创建者抽象类
public abstract class DocumentCreator
{
// Factory Method
public abstract Document CreateDocument();
public void OpenDocument()
{
Document doc = CreateDocument();
doc.Open();
}
}
// 步骤4: 创建具体创建者类
public class WordDocumentCreator : DocumentCreator
{
public override Document CreateDocument() => new WordDocument();
}
public class PdfDocumentCreator : DocumentCreator
{
public override Document CreateDocument() => new PdfDocument();
}
// 使用
class Program
{
static void Main(string[] args)
{
DocumentCreator creator = new WordDocumentCreator();
creator.OpenDocument(); // Outputs: Word document opened.
creator = new PdfDocumentCreator();
creator.OpenDocument(); // Outputs: PDF document opened.
}
}
|
理解这个Design Pattern还是花了点脑子,如果你看到了这里个人推荐去看看原文Factory method。虽然原文感觉更不好啃,但是换一种视角来看对于加深理解非常有用,祝你学习顺利: ) 👍