工厂模式是软件设计模式中创建型模式的一种,主要用于解耦对象的创建过程。其核心思想是定义一个用于创建对象的接口或类,让子类决定实例化哪一个类,从而使客户端(调用者)无需知道具体生产何种产品。
工厂模式通常分为三种形态:
简单工厂模式 (Simple Factory Pattern)
// 简单工厂示例代码
public interface Pizza {
void prepare();
}
public class GreekPizza implements Pizza {
@Override
public void prepare() {
// 准备希腊披萨的材料和制作过程
}
}
public class CheesePizza implements Pizza {
@Override
public void prepare() {
// 准备芝士披萨的材料和制作过程
}
}
// 工厂类
public class PizzaFactory {
public static Pizza createPizza(String type) {
if ("Greek".equals(type)) {
return new GreekPizza();
} else if ("Cheese".equals(type)) {
return new CheesePizza();
} else {
throw new IllegalArgumentException("Invalid pizza type");
}
}
}
// 使用简单工厂
public class Client {
public static void main(String[] args) {
Pizza pizza = PizzaFactory.createPizza("Greek");
pizza.prepare();
}
}
工厂方法模式 (Factory Method Pattern)
// 工厂方法示例代码
public abstract class PizzaStore {
abstract Pizza createPizza(String type);
public void orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
}
}
public class GreekPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String type) {
if ("Greek".equals(type)) {
return new GreekPizza();
} else {
throw new IllegalArgumentException("Greek store only sells Greek Pizzas!");
}
}
}
// 其他如 CheesePizzaStore 类也类似...
// 使用工厂方法
public class Client {
public static void main(String[] args) {
PizzaStore store = new GreekPizzaStore();
store.orderPizza("Greek");
}
}
抽象工厂模式 (Abstract Factory Pattern)
```java
// 抽象工厂示例代码简化版
interface PizzaIngredientFactory {
Dough createDough();
Sauce createSauce();
Cheese createCheese();
// ... 其他配料
}
class GreekPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
Dough createDough() { /* 返回希腊风格面团 */ }
// 其他实现...
}
class ItalianPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
Dough createDough() { /* 返回意大利风格面团 */ }
// 其他实现...
}
class PizzaStore {
private final PizzaIngredientFactory ingredientFactory;
PizzaStore(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
// 使用工厂来创建披萨及其原料
// ...
}
// 使用抽象工厂
public class Client {
public static void main(String[] args) {
PizzaStore greekStore = new PizzaStore(new GreekPizzaIngredientFactory());
// 使用希腊风味原料制作披萨
}
}