工厂模式是一种常用的创建型设计模式。它提供了一种创建对象的最佳方式,可以在不指定具体类的情况下创建一组相关或相互依赖的对象。工厂模式的主要优点是将对象的创建逻辑封装在一个单独的类中,这有助于降低客户端代码与具体实现之间的耦合度。
工厂模式的基本形式
工厂模式主要有两种形式:
- 简单工厂模式(Simple Factory Pattern)
- 工厂方法模式(Factory Method Pattern)
简单工厂模式
简单工厂模式由一个工厂对象决定创建出哪一个产品类的实例。客户端通过调用工厂类的方法获取所需的产品对象,无需知道具体的实现细节。
结构图:
- Product: 抽象产品类或接口
- ConcreteProduct: 具体产品类
- SimpleFactory: 工厂类
示例代码:
// Product interface
interface Product {
void doSomething();
}
// ConcreteProduct classes
class ConcreteProductA implements Product {
@Override
public void doSomething() {
System.out.println("ConcreteProductA is doing something.");
}
}
class ConcreteProductB implements Product {
@Override
public void doSomething() {
System.out.println("ConcreteProductB is doing something.");
}
}
// SimpleFactory class
class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
return null;
}
}
// Client code
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.doSomething();
Product productB = SimpleFactory.createProduct("B");
productB.doSomething();
}
}
工厂方法模式
工厂方法模式定义了一个创建对象的接口,但让实现这个接口的类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。
结构图:
- Creator: 抽象创建者类或接口
- ConcreteCreator: 具体创建者类
- Product: 抽象产品类或接口
- ConcreteProduct: 具体产品类
示例代码:
// Product interface
interface Product {
void doSomething();
}
// ConcreteProduct classes
class ConcreteProductA implements Product {
@Override
public void doSomething() {
System.out.println("ConcreteProductA is doing something.");
}
}
class ConcreteProductB implements Product {
@Override
public void doSomething() {
System.out.println("ConcreteProductB is doing something.");
}
}
// Creator interface
interface Creator {
Product factoryMethod();
}
// ConcreteCreator classes
class ConcreteCreatorA implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// Client code
public class Client {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.doSomething();
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.doSomething();
}
}
使用场景
- 当创建的对象需要根据环境或配置的不同而改变时。
- 当一个类希望由其子类来指定它所创建的对象时。
- 当类将创建对象的任务委托给多个帮助子类中的某一个,并且用户希望增加新的这种类型时。
这两种模式都有助于解耦客户端代码与具体实现,提高了代码的灵活性和可扩展性。选择哪种模式取决于你的具体需求和设计目标。