简单工厂模式
介绍
-
简单工厂模式(又称静态工厂模式):定义一个创建对象的类,由这个类来封装实例化对象的行为。
-
简单工厂模式应用场景:当我们需要根据传入的参数来动态创建对象时,可以使用简单工厂模式。
-
简单工厂模式的角色:
-
工厂类(Creator):负责创建产品的类。在简单工厂模式中,工厂类提供了一个静态方法,根据传入的参数来创建不同的产品对象。
-
产品类(Product):由工厂类创建的对象。
-
-
示例代码:
// 产品接口 interface Product { void display(); } // 具体产品 A class ConcreteProductA implements Product { @Override public void display() { System.out.println("This is product A."); } } // 具体产品 B class ConcreteProductB implements Product { @Override public void display() { System.out.println("This is product B."); } } // 简单工厂类 class SimpleFactory { // 根据类型创建具体产品对象 public static Product createProduct(String type) { switch (type) { case "A": return new ConcreteProductA(); case "B": return new ConcreteProductB(); default: throw new IllegalArgumentException("Unsupported product type."); } } } // 客户端代码 public class Main { public static void main(String[] args) { // 使用简单工厂创建产品 Product productA = SimpleFactory.createProduct("A"); Product productB = SimpleFactory.createProduct("B"); // 调用产品方法 productA.display(); // Output: This is product A. productB.display(); // Output: This is product B. } }
在上面的代码中,我们定义了一个
SimpleFactory
工厂类,它提供了一个静态方法createProduct()
,根据传入的参数来创建不同的产品对象。我们还定义了两个产品类ConcreteProductA
和ConcreteProductB
,它们都实现了display()
方法。最后,我们使用工厂类创建了两个产品对象productA
和productB
,并调用了它们的display()
方法。
说明
简单工厂模式并不是一无是处。如果产品的类型是确定的,那么之后就不会需要修改工厂方法。Boolean 的 valueOf() 方法就是一个例子:
public class Boolean {
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
}
另外,可考虑用静态工厂方法替代构造方法。
根据《Effective Java》,静态工厂方法可用来代替构造方法,提供更加易用的 API 和更丰富的功能。其相比于构造方法包括但不限于有以下优点:
- 静态工厂方法有名称,相比于构造方法,可提供更可读的 API。
- 静态工厂方法可以不用每次调用时都创建新的对象,而可以自行实现对象复用。
- 静态工厂方法可以返回原返回类型的任何子类型的对象,而不仅仅是产品类的对象。
另:
简单工厂模式不属于 23 中设计模式,它是工厂模式的一种变种。
简单工厂模式违反了开闭原则,如果需要增加对象实例的返回,就必须修改工厂类的代码逻辑。
开闭原则:对修改关闭,对扩展开放。要增加一个新的逻辑,可以新加一个类,但不要在原有类的基础上修改。
主要内容来自:ChatGPT