设计模式(创建型模式):工厂方法

介绍完简单工厂之后,现在就来介绍一下工厂方法模式。之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大。 而工厂方法模式就是对简单工厂的进一步抽象,引入了抽象工厂,而具体的产品则由具体的产品工厂来进行构建。从而将创建对象的工作从一个工厂当中分离出来,转而延迟到具体的产品工厂来进行实例化。 所以,在工厂方法模式当中,由这 4 个对象构成:

  1. 抽象工厂
  2. 具体工厂
  3. 抽象产品
  4. 具体产品 抽象工厂用于用于定义创建产品等抽象方法,而具体工厂则实习现这些接口用来创建具体产品。我们用来代码来实现。 抽象工厂:
1
2
3
4
public abstract class AbsFactory
{
    public abstract Food CreateFood();
}

具体工厂A:

1
2
3
4
5
6
7
public class FactoryA : AbsFactory
{
    public override Food CreateFood()
    {
        return new FoodA();
    }
}

具体工厂B:

1
2
3
4
5
6
7
public class FactoryB : AbsFactory
{
    public override Food CreateFood()
    {
        return new FoodB();
    }
}

抽象产品:

1
2
3
4
public abstract class Food
{
    public abstract void Print();
}

具体产品A:

1
2
3
4
5
6
7
public class FoodA : Food
{
    public override void Print()
    {
        Console.WriteLine("这是具体产品A");
    }
}

具体产品B:

1
2
3
4
5
6
7
public class FoodB : Food
{
    public override void Pring()
    {
        Console.WriteLine("这是具体产品B");
    }
}

使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class Startup
{
    static void Main()
    {
        Food foodA = new FactoryA().CreateFood();
        Food foodb = new FactoryB().CreateFood();
        foodA.Print();
        foodB.Print();
    }
}

这些工厂类别的设计模式都对用户隐藏了创建细节,用户不用关心对象是如何创建的,只需要调用工厂方法来创建即可。 而且工厂方法将具体的操作落实到具体子类,这样的话,当新增产品的时候不需要对工厂类进行任何更改,直接继承自抽象工厂即可。 不过也有不好的地方,你每次要新增一个产品,那么也就意味着你也需要增加一个相应的工厂,会造成系统复杂度提升。 工厂模式核心基本上就是,将对象的依赖由对象到工厂。

Built with Hugo
主题 StackJimmy 设计