工厂模式(Factory Method)学习笔记

工厂模式(Factory Method)学习笔记,同时包含在Unity中的应用

AssistedByChatGPT

工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个创建对象的接口,但将实际创建对象的工作推迟到子类中进行。这使得在不指定具体类的情况下创建对象成为可能,增加了代码的灵活性和可扩展性。 hmmm生硬的解释可能比较难以理解,换句话说就是把各个子类需要特殊实现的方法和属性分离开,公用的方法和属性则仍然放在Factory里。且当需要增加子类时不需要去修改已有代码。

目的和应用场景

工厂方法模式主要用于以下情况:

  • 当创建对象的逻辑比较复杂时,可以将其封装在一个专门的工厂里。
  • 当需要对创建的对象进行后处理,或者需要使用不同的方法或参数来创建对象时。
  • 当需要增加程序的灵活性和可扩展性,使得新增加的产品类不需要修改已有代码,或者最小化修改。

如何实现

工厂方法模式通常涉及以下几个角色:

  • 产品(Product):定义工厂方法所创建的对象的接口。

  • 具体产品(Concrete Product):实现产品接口的具体类。

  • 创建者(Creator):声明工厂方法,返回一个产品对象。创建者也可以提供工厂方法的默认实现,也就是共通的方法和属性。

  • 具体创建者(Concrete Creator):重写工厂方法以返回一个具体产品实例。

示例

个软件系统用于管理不同类型的文档。在这个系统中,我们会有一个文档的基类以及几个派生类,分别代表不同类型的文档。通过使用Factory Method模式,我们能够根据需要在运行时创建不同类型的文档实例。

  1. 定义产品接口:首先定义一个文档(Document)的接口或者一个抽象类,确定文档应有的基本行为。
  2. 创建具体产品类:然后为每种类型的文档创建具体的类,如WordDocumentPdfDocument,它们都实现Document接口或者继承自一个抽象文档类。
  3. 定义创建者抽象类:定义一个创建者类(Creator),其中包含一个抽象的Factory Method,该方法返回一个文档对象。
  4. 创建具体创建者类:为每种文档类型创建一个创建者子类(如WordDocumentCreatorPdfDocumentCreator),并重写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。虽然原文感觉更不好啃,但是换一种视角来看对于加深理解非常有用,祝你学习顺利: ) 👍

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus