工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但将具体的对象创建延迟到子类中。换句话说,工厂方法模式让子类决定实例化哪个类。
核心思想
-
抽象工厂接口
定义一个接口(或抽象类),其中包含一个创建对象的方法(例如
CreateProduct
)。这个方法的具体实现由子类完成。 -
具体工厂类
每个具体工厂类负责创建一种具体的产品。例如,
FactoryA
创建ProductA
,FactoryB
创建ProductB
。 -
产品接口
定义一个产品接口,所有具体产品都需要实现这个接口。客户端代码通过产品接口与具体产品交互,而不需要知道具体产品的类名。
-
解耦
客户端代码只需要知道工厂接口和产品接口,而不需要关心具体的产品类和工厂类。这样可以将对象的创建与使用分离,提高代码的灵活性和可维护性。
适用场景
-
当系统需要支持多种产品类型,并且未来可能会增加新的产品类型时。
-
当对象的创建过程复杂或需要解耦时。
-
当客户端代码需要根据条件创建不同的对象时。
优点
-
符合开闭原则,易于扩展。
-
客户端代码与具体产品解耦,提高了代码的灵活性。
缺点
- 每增加一个产品,就需要增加一个具体工厂类,可能会导致类的数量增加。
工厂方法模式的C#代码示例
下面是一个使用C#实现的工厂方法模式示例代码,并附有详细的文字说明。
代码实现
csharp
cs
using System;
// 产品接口
public interface IProduct
{
void Operation();
}
// 具体产品A
public class ProductA : IProduct
{
public void Operation()
{
Console.WriteLine("ProductA operation.");
}
}
// 具体产品B
public class ProductB : IProduct
{
public void Operation()
{
Console.WriteLine("ProductB operation.");
}
}
// 工厂接口
public interface IFactory
{
IProduct CreateProduct();
}
// 具体工厂A,用于创建ProductA
public class FactoryA : IFactory
{
public IProduct CreateProduct()
{
return new ProductA();
}
}
// 具体工厂B,用于创建ProductB
public class FactoryB : IFactory
{
public IProduct CreateProduct()
{
return new ProductB();
}
}
class Program
{
static void Main(string[] args)
{
// 创建工厂A并生产产品A
IFactory factoryA = new FactoryA();
IProduct productA = factoryA.CreateProduct();
productA.Operation();
// 创建工厂B并生产产品B
IFactory factoryB = new FactoryB();
IProduct productB = factoryB.CreateProduct();
productB.Operation();
}
}
代码说明
-
产品接口
IProduct
-
定义了一个
Operation
方法,所有具体产品都需要实现这个接口。 -
这是工厂方法模式的核心,确保所有产品具有统一的接口。
-
-
具体产品
ProductA
和ProductB
-
ProductA
和ProductB
是实现了IProduct
接口的具体产品类。 -
每个产品类都有自己的
Operation
实现。
-
-
工厂接口
IFactory
-
定义了一个
CreateProduct
方法,用于创建产品。 -
所有具体工厂都需要实现这个接口。
-
-
具体工厂
FactoryA
和FactoryB
-
FactoryA
负责创建ProductA
,FactoryB
负责创建ProductB
。 -
每个工厂类都实现了
IFactory
接口,并在CreateProduct
方法中返回具体的产品实例。
-
-
主程序验证
-
在
Main
方法中,分别创建FactoryA
和FactoryB
的实例。 -
通过工厂的
CreateProduct
方法创建产品,并调用产品的Operation
方法。 -
输出结果验证了工厂方法模式的正确性。
-
输出结果
运行上述代码后,输出如下:
cs
ProductA operation.
ProductB operation.
工厂方法模式的扩展性
如果需要增加新的产品类型,只需要增加一个新的具体产品类和对应的具体工厂类,而不需要修改现有代码。例如:
csharp
cs
// 新增具体产品C
public class ProductC : IProduct
{
public void Operation()
{
Console.WriteLine("ProductC operation.");
}
}
// 新增具体工厂C
public class FactoryC : IFactory
{
public IProduct CreateProduct()
{
return new ProductC();
}
}
然后在 Main
方法中使用新的工厂:
csharp
cs
IFactory factoryC = new FactoryC();
IProduct productC = factoryC.CreateProduct();
productC.Operation();
输出结果:
cs
ProductC operation.
总结
工厂方法模式通过将对象的创建与使用分离,提高了代码的灵活性和可维护性。它符合开闭原则,易于扩展,适用于需要支持多种产品类型的场景。