GoF(Gang of Four)设计模式中的工厂模式(Factory Pattern)属于创建型模式,它旨在处理对象的创建,目的是将对象的创建过程与其使用过程分离,以提高代码的灵活性和可维护性。
-
GoF23种设计模式可分为三大类:
-
创建型(5个):解决对象创建问题。
-
单例模式
-
工厂方法模式
-
抽象工厂模式
-
建造者模式
-
原型模式
-
-
结构型(7个):一些类或对象组合在一起的经典结构。
-
代理模式
-
装饰模式
-
适配器模式
-
组合模式
-
享元模式
-
外观模式
-
桥接模式
-
-
行为型(11个):解决类或对象之间的交互问题。
-
策略模式
-
模板方法模式
-
责任链模式
-
观察者模式
-
迭代子模式
-
命令模式
-
备忘录模式
-
状态模式
-
访问者模式
-
中介者模式
-
解释器模式
-
-
-
工厂模式是解决对象创建问题的,所以工厂模式属于创建型设计模式。这里为什么学习工厂模式呢?这是因为Spring框架底层使用了大量的工厂模式。
工厂模式主要分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。以下是详细介绍:
1. 简单工厂模式(Simple Factory)
定义:通过一个工厂类来决定实例化哪一个产品类。简单工厂模式并不是GoF中的23种设计模式之一,但它常被认为是一种工厂模式的基本实现。
结构:
- 工厂类:负责根据传入的参数决定创建哪一种具体的产品实例。
- 产品类:所有产品的父类或者接口,定义所有产品共有的接口。
- 具体产品类:具体的产品类,工厂类将根据不同条件实例化这些具体类。
优点:
- 客户端不需要关心对象的创建细节,只需调用工厂即可获取对象。
缺点:
- 工厂类可能过于复杂,违背了“开放-关闭原则”(对扩展开放,对修改关闭)。每当添加新产品时,必须修改工厂类代码。
示例:
public class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ProductA();
} else if ("B".equals(type)) {
return new ProductB();
}
return null;
}
}
2. 工厂方法模式(Factory Method)
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使得一个类的实例化延迟到子类。
结构:
- 抽象工厂类:声明了工厂方法,定义了创建对象的接口。
- 具体工厂类:实现了工厂方法,负责具体的产品创建。
- 产品接口:定义产品的接口。
- 具体产品类:实现产品接口的具体产品。
优点:
- 符合“开放-关闭原则”,当需要增加新产品时,不需要修改已有代码,只需增加新的工厂类和产品类。
缺点:
- 增加了代码的复杂性,每增加一个新的产品,都需要增加一个新的工厂类。所以可能会出现类爆炸。
示例:
// 抽象产品类
public interface Product {
void use();
}
// 具体产品类
public class ProductA implements Product {
public void use() {
System.out.println("Using ProductA");
}
}
// 抽象工厂类
public abstract class Factory {
public abstract Product createProduct();
}
// 具体工厂类
public class ProductAFactory extends Factory {
public Product createProduct() {
return new ProductA();
}
}
3. 抽象工厂模式(Abstract Factory)
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构:
- 抽象工厂类:声明了创建不同产品的方法。
- 具体工厂类:实现了不同产品族的创建。
- 抽象产品类:定义产品的共同接口。
- 具体产品类:实现抽象产品接口的具体产品。
优点:
- 提供了产品族的概念,可以保证同一产品族中的对象一致性。
缺点:
- 增加了系统的复杂性,当需要添加新的产品族时,所有的工厂类都需要进行修改,违背了“开放-关闭原则”。
示例:
// 抽象产品A类
public interface ProductA {
void use();
}
// 抽象产品B类
public interface ProductB {
void eat();
}
// 具体产品A类
public class ProductA1 implements ProductA {
public void use() {
System.out.println("Using ProductA1");
}
}
// 具体产品B类
public class ProductB1 implements ProductB {
public void eat() {
System.out.println("Eating ProductB1");
}
}
// 抽象工厂类
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂类
public class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ProductA1();
}
public ProductB createProductB() {
return new ProductB1();
}
}
工厂模式的优缺点
优点:
- 封装对象创建:将对象的创建过程封装起来,避免了直接使用
new操作符。 - 符合单一职责原则:工厂负责对象创建,业务逻辑中不关心对象的生成。
- 符合开闭原则:尤其是工厂方法模式和抽象工厂模式,通过扩展工厂类和产品类,可以实现对现有代码的扩展而不修改原有代码。
缺点:
- 代码复杂性增加:尤其是工厂方法和抽象工厂模式,需要定义多个接口和类,增加了系统的复杂度。
- 不适合少量产品:对于产品种类较少的情况,使用工厂模式可能过度设计。
适用场景
- 当创建对象的逻辑复杂,并且需要集中管理时使用简单工厂模式。
- 当创建的对象具有相同接口但具有不同实现时使用工厂方法模式。
- 当系统中存在多个产品族,并且需要保证产品之间的相互一致性时使用抽象工厂模式。
通过工厂模式,代码可以保持更好的可维护性、可扩展性和灵活性。
252

被折叠的 条评论
为什么被折叠?



