工厂模式
大约 2 分钟
什么是工厂模式
工厂模式(Factory Pattern)是一种创建对象的设计模式,通过定义一个创建对象的接口来让子类决定实例化哪一个类。
工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
何时使用
- 需要创建大量相似对象的场景。
- 需要将对象的创建过程与具体实现解耦的场景。
- 对于复杂对象的创建逻辑,尤其是在需要配置的情况下。
简单工厂模式
通过一个工厂类来创建对象,工厂类负责决定创建哪个具体产品。客户端直接调用工厂方法。
新增产品需要修改工厂类的代码。
示例-简单工厂
/**
* 产品顶层接口
*/
interface Product {
void use();
}
/**
* 产品具体实现
*/
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using Product A");
}
}
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using Product B");
}
}
/**
* 工厂类
*/
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;
}
}
/**
* 客户端
* @author LingYuan
*/
public class FactoryPatternExample {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
if (productA != null) {
productA.use();
}
Product productB = SimpleFactory.createProduct("B");
if (productB != null) {
productB.use();
}
}
}
工厂方法模式
定义一个接口用于创建对象,具体的产品类由子类实现工厂接口。每个具体工厂类负责创建一个具体产品。
新增产品只需添加新的工厂类和产品类,而无需修改现有代码。适合产品种类较多或变化频繁的场景。
示例-工厂方法
/**
* 产品顶层接口
*/
interface Product {
void use();
}
/**
* 具体产品A
*/
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using Product A");
}
}
/**
* 具体产品B
*/
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using Product B");
}
}
/**
* 工厂接口
*/
interface ProductFactory {
Product createProduct();
}
// 具体工厂A
class ConcreteFactoryA implements ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteFactoryB implements ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
/**
* 客户端
*/
public class FactoryMethodPatternExample {
public static void main(String[] args) {
ProductFactory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use();
ProductFactory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use();
}
}