简单工厂模式
# 分类
创建型模式
# 定义
简单工厂模式(Simple Factory Pattern) 又称静态工厂方法模式
,简单工厂模式中专门定义一个类,来负责创建其他类的实例,被创建的实例通常具有共同的父类或接口
。
# 意图
简单工厂模式的意图是根据提供给他们的数据,通常为一个字符串或枚举
,返回几个可能类中的一个类的实例。
# 应用场景
- 对于
产品种类相对较少的情况
,考虑使用简单工厂模式。 - 使用简单工厂模式的客户端只需要
传入工厂类的参数
,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
# 角色与结构图
- IProduct:
抽象产品角色
抽象产品角色是所创建所有对象的父类,负责描述所有实例所共有的公共接口。 - ConcreteProduct:
具体产品角色
具体产品角色是创建目标,所有创建的对象都充当 IProduct 这个角色的某个具体实例。 - Factory:
工厂角色
工厂角色负责实现创建所有实例的内部逻辑。
下图解释了简单工厂模式中各角色的作用

# 示例代码
//工厂类
public enum Category
{
A,
B
}
public class ProductFactory
{
public static IProduct Create(Category category)
{
switch (category)
{
case Category.A:
return new ConcreteProductA();
case Category.B:
return new ConcreteProductB();
default:
throw new NotSupportedException();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//产品系列
interface IProduct{
void Use();
}
class ConcreteProductA : Iproduct{
public void Use(){
Console.WriteLine("A产品");
}
}
class ConcreteProductB : Iproduct{
public void Use(){
Console.WriteLine("B产品");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
//客户端代码
static void Main(string[] args){
IProduct product = ProductFactory.Create(Category.B);
product.Use();
}
1
2
3
4
5
2
3
4
5
# 优点
- 工厂类含有必要的判断逻辑,可决定创建产品实例的实际时刻。
工厂和产品的职责区分明确
,客户端仅仅“消费”产品。 - 客户端只需要知道具体产品类所
对应的参数
即可。
# 缺点
- 工厂类集中了所有产品的创建逻辑,
职责过重
,一旦发生异常,整个系统将受影响。 - 使用简单工厂模式将会
增加系统中类的个数
,在一定程序上增加了系统的复杂度和理解难度。 - 系统
扩展困难
,一旦增加新产品就不得不修改工厂逻辑
,在产品类型较多时,可能造成逻辑过于复杂。 - 简单工厂模式由于使用了
静态工厂方法
,造成工厂角色无法形成基于继承的等级结构
。 - 简单工厂
只能创建一种类型实例
。例如:只能创建工程师类型实例。
# 小结
- 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化,这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。
# 一句话概括
静态方法封装创建其他类实例的细节逻辑,并根据传入的参数创建对应实例。
编辑 (opens new window)
上次更新: 2025/03/22, 13:47:44