文章目录
1. 工厂方法模式概述
1.1 定义与核心思想
工厂方法模式(Factory Method Pattern)
**定义:**是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
**核心思想:**工厂模式的核心思想是将对象的创建和使用分离,通过一个工厂类来负责对象的创建。客户端只需要向工厂类请求创建对象,而不需要关心对象是如何创建的。这样可以降低代码的耦合度,提高代码的可维护性和可扩展性。
通俗理解:就像你去餐厅点餐,菜单(工厂接口)上有很多菜(产品),但具体是哪位厨师(具体工厂)来做这道菜,由餐厅(客户端)决定。你(客户端代码)不需要关心具体是谁做的,只需要知道你要点的菜(产品接口)就行了。
1.2 模式结构
角色 | 描述 | 对应示例 |
---|---|---|
Product | 定义产品的接口 | 电子产品接口 |
ConcreteProduct | 实现Product接口的具体产品类 | 手机、电脑等具体产品 |
Creator | 声明工厂方法,返回Product类型的对象 | 电子工厂接口 |
ConcreteCreator | 重写工厂方法,返回一个ConcreteProduct实例 | 手机工厂、电脑工厂等具体工厂 |
2. 工厂方法模式详解
2.1 基本实现步骤
- 定义产品接口:声明所有产品必须实现的通用接口
- 创建具体产品类:实现产品接口的具体类
- 定义工厂接口:声明返回产品对象的工厂方法
- 实现具体工厂类:每个具体工厂对应一个具体产品
- 客户端使用:通过工厂接口创建产品,而不直接实例化具体类
2.2 代码示例:电子产品工厂
2.2.1 产品接口与具体产品
实现过程:
1. 定义产品接口
首先,定义了一个名为 ElectronicProduct
的接口,该接口声明了所有电子产品的通用操作方法:powerOn()
、operate()
和 powerOff()
。这确保了无论哪个具体的电子设备都必须提供这些基本功能的实现。
2. 实现具体产品
接着,为每种具体的电子设备创建了实现了 ElectronicProduct
接口的类。这里提供了两个具体产品的实现:SmartPhone
和 Laptop
。
// 产品接口
public interface ElectronicProduct {
void powerOn();
void operate();
void powerOff();
}
// 具体产品1:智能手机
public class SmartPhone implements ElectronicProduct {
@Override
public void powerOn() {
System.out.println("智能手机开机:显示品牌Logo");
}
@Override
public void operate() {
System.out.println("智能手机运行:触摸屏操作");
}
@Override
public void powerOff() {
System.out.println("智能手机关机:动画效果");
}
}
// 具体产品2:笔记本电脑
public class Laptop implements ElectronicProduct {
@Override
public void powerOn() {
System.out.println("笔记本电脑启动:BIOS自检");
}
@Override
public void operate() {
System.out.println("笔记本电脑运行:键盘和触摸板操作");
}
@Override
public void powerOff() {
System.out.println("笔记本电脑关机:保存所有工作");
}
}
2.2.2 工厂接口与具体工厂
// 工厂接口
public interface ElectronicFactory {
ElectronicProduct createProduct();
void prepareForSelling();
}
// 具体工厂1:手机工厂
public class PhoneFactory implements ElectronicFactory {
@Override
public ElectronicProduct createProduct() {
System.out.println("手机工厂:组装智能手机");
return new SmartPhone();
}
@Override
public void prepareForSelling() {
System.out.println("手机工厂:安装系统、测试网络、包装");
}
}
// 具体工厂2:电脑工厂
public class LaptopFactory implements ElectronicFactory {
@Override
public ElectronicProduct createProduct() {
System.out.println("电脑工厂:组装笔记本电脑");
return new Laptop();
}
@Override
public void prepareForSelling() {
System.out.println("电脑工厂:安装操作系统、测试硬件、包装");
}
}
2.2.3 客户端使用
public class Client {
public static void main(String[] args) {
// 创建手机工厂
ElectronicFactory phoneFactory = new PhoneFactory();
// 生产手机
ElectronicProduct phone = phoneFactory.createProduct();
phoneFactory.prepareForSelling();
// 使用手机
phone.powerOn();
phone.operate();
phone.powerOff();
System.out.println("---------------------");
// 创建电脑工厂
ElectronicFactory laptopFactory = new LaptopFactory();
// 生产电脑
ElectronicProduct laptop = laptopFactory.createProduct();
laptopFactory.prepareForSelling();
// 使用电脑
laptop.powerOn();
la