工厂模式是一种创建型设计模,工厂模式将对象的创建过程封装起来,客户端不需要知道具体创建的是哪个类的实例,只需要知道对应的工厂即可。
工厂模式分为三类
简单工厂模式(Simple Factory)
- 由一个工厂类根据传入的参数决定创建哪一种产品类的实例
- 工厂类集中了所有产品的创建逻辑
- 违反了开闭原则,添加新产品时需要修改工厂类
java
// 饮品接口
interface Beverage {
void prepare();
}
// 咖啡实现
class Coffee implements Beverage {
@Override
public void prepare() {
System.out.println("制作一杯香浓咖啡");
}
}
// 茶实现
class Tea implements Beverage {
@Override
public void prepare() {
System.out.println("泡一壶清香茶水");
}
}
// 果汁实现
class Juice implements Beverage {
@Override
public void prepare() {
System.out.println("榨一杯新鲜果汁");
}
}
// 简单饮品工厂
class BeverageFactory {
public static Beverage createBeverage(String type) {
switch (type.toLowerCase()) {
case "coffee":
return new Coffee();
case "tea":
return new Tea();
case "juice":
return new Juice();
default:
throw new IllegalArgumentException("不支持的饮品类型: " + type);
}
}
}
// 使用示例
public class SimpleFactoryDemo {
public static void main(String[] args) {
// 顾客点单
Beverage coffee = BeverageFactory.createBeverage("coffee");
coffee.prepare();
Beverage tea = BeverageFactory.createBeverage("tea");
tea.prepare();
Beverage juice = BeverageFactory.createBeverage("juice");
juice.prepare();
}
}
工厂方法模式(Factory Method)
- 定义一个创建产品对象的接口,让子类决定实例化哪一个类
- 工厂方法使一个类的实例化延迟到其子类
- 符合开闭原则,易于扩展
java
// 运输工具接口
interface Transport {
void deliver();
}
// 卡车实现
class Truck implements Transport {
@Override
public void deliver() {
System.out.println("通过陆路运输货物");
}
}
// 轮船实现
class Ship implements Transport {
@Override
public void deliver() {
System.out.println("通过海运运输货物");
}
}
// 运输工厂接口
interface Logistics {
Transport createTransport();
}
// 陆路运输工厂
class RoadLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Truck();
}
}
// 海路运输工厂
class SeaLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Ship();
}
}
// 使用示例
public class LogisticsDemo {
public static void main(String[] args) {
// 陆路运输
Logistics roadLogistics = new RoadLogistics();
Transport truck = roadLogistics.createTransport();
truck.deliver();
// 海路运输
Logistics seaLogistics = new SeaLogistics();
Transport ship = seaLogistics.createTransport();
ship.deliver();
}
}
抽象工厂模式(Abstract Factory)
- 提供一个创建一系列相关或相互依赖对象的接口
- 无需指定它们具体的类
- 适用于产品族的创建
java
// 手机接口
interface Phone {
void call();
}
// 笔记本接口
interface Laptop {
void work();
}
// iPhone实现
class IPhone implements Phone {
@Override
public void call() {
System.out.println("使用iPhone打电话");
}
}
// MacBook实现
class MacBook implements Laptop {
@Override
public void work() {
System.out.println("使用MacBook办公");
}
}
// 小米手机实现
class MiPhone implements Phone {
@Override
public void call() {
System.out.println("使用小米手机打电话");
}
}
// 小米笔记本实现
class MiLaptop implements Laptop {
@Override
public void work() {
System.out.println("使用小米笔记本办公");
}
}
// 电子产品套装工厂接口
interface ElectronicsFactory {
Phone createPhone();
Laptop createLaptop();
}
// 苹果产品套装工厂
class AppleFactory implements ElectronicsFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
@Override
public Laptop createLaptop() {
return new MacBook();
}
}
// 小米产品套装工厂
class MiFactory implements ElectronicsFactory {
@Override
public Phone createPhone() {
return new MiPhone();
}
@Override
public Laptop createLaptop() {
return new MiLaptop();
}
}
// 使用示例
public class ElectronicsDemo {
public static void main(String[] args) {
// 苹果产品套装
ElectronicsFactory appleFactory = new AppleFactory();
Phone iPhone = appleFactory.createPhone();
Laptop macBook = appleFactory.createLaptop();
iPhone.call();
macBook.work();
// 小米产品套装
ElectronicsFactory miFactory = new MiFactory();
Phone miPhone = miFactory.createPhone();
Laptop miLaptop = miFactory.createLaptop();
miPhone.call();
miLaptop.work();
}
}