### Java设计模式详解
#### 创建型模式
**1.1 工厂方法(Factory Method)**
工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下场景中特别有用:
1. **未知具体类时**:当一个类不知道它所必须创建的对象的确切类时,工厂方法模式提供了一种灵活的解决方案。
2. **子类决策**:当一个类希望由其子类来指定它所创建的对象时,工厂方法模式提供了一个机制,允许子类控制实例的创建。
3. **职责委托**:当所将创建对象的职责委托给多个帮助子类中的某一个时,工厂方法模式能够将哪个帮助子类是代理者的信息局部化。
**参与者**:
- `Product`:定义工厂方法所创建的对象的接口。
- `ConcreteProduct`:实现`Product`接口的具体产品类。
- `Creator`:声明工厂方法,该方法返回一个`Product`类型的对象。`Creator`也可以定义一个工厂方法的默认实现,它返回一个默认的`ConcreteProduct`对象。
- `ConcreteCreator`:重定义工厂方法以返回一个`ConcreteProduct`实例。
**示例代码**:
```java
// Product Interface
public interface Work {
void doWork();
}
// Concrete Product
public class StudentWork implements Work {
public void doWork() {
System.out.println("学生做作业!");
}
}
public class TeacherWork implements Work {
public void doWork() {
System.out.println("老师审批作业!");
}
}
// Creator Interface
public interface IWorkFactory {
Work getWork();
}
// Concrete Creator
public class StudentWorkFactory implements IWorkFactory {
public Work getWork() {
return new StudentWork();
}
}
public class TeacherWorkFactory implements IWorkFactory {
public Work getWork() {
return new TeacherWork();
}
}
// Test
public class Test {
public static void main(String[] args) {
IWorkFactory studentWorkFactory = new StudentWorkFactory();
studentWorkFactory.getWork().doWork();
IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
teacherWorkFactory.getWork().doWork();
}
}
```
这段代码展示了如何通过工厂方法模式来创建不同的工作类型(学生做作业或老师审批作业),体现了工厂方法模式的核心思想:将对象的创建逻辑封装在具体的工厂类中,从而实现了代码的高内聚和低耦合。
**1.1.2 抽象工厂(Abstract Factory)**
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。它通常用于系统中有多个产品族的情况下,每个产品族包含多个关联的产品。通过使用抽象工厂模式,系统可以在不修改代码的情况下更换整个产品族。
**1.1.3 建造者(Builder)**
建造者模式主要用于创建复杂对象的算法应该独立于部件以及部件的装配方式的情况。它允许你逐步构建一个复杂的对象,并且允许你使用相同的构建过程创建多种不同表示的对象。
**1.1.4 单态模式(Singleton)**
单态模式确保一个类只有一个实例,并提供一个全局访问点。这在资源管理、配置管理等场景下特别有用,其中只应存在一个实例以确保数据的一致性和完整性。
**1.1.5 原型模式(Prototype)**
原型模式通过复制一个已有实例来创建新对象,而不是通过构造函数实例化对象。这在创建对象成本高昂或者对象初始化复杂时特别有用。
#### 结构型模式
接下来,我们将继续探讨结构型模式,这些模式关注于简化系统的设计,使其更易于理解和维护。包括但不限于适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。每一种模式都有其独特的应用场景和解决问题的方法,如适配器模式用于让两个不兼容的接口能够协同工作,桥接模式用于将抽象与实现分离,以便两者可以独立变化,等等。
#### 行为型模式
行为型模式主要关注于对象之间的职责分配。例如,责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法和访问者模式。这些模式帮助我们设计出更加灵活、可扩展和可维护的系统,比如观察者模式用于建立一对多的依赖关系,使得多个对象可以监听并响应一个对象的状态改变。
设计模式是一种通用的、可复用的解决方案,用于解决软件设计中的常见问题。掌握并应用这些模式可以帮助开发者写出更加优雅、高效和健壮的代码。