### Java23种设计模式 #### 1. 设计模式(超级详细) ##### 1.1 创建型模式 ###### 1.1.1 工厂方法 **工厂方法模式**是一种常用的创建型设计模式,其核心是定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式把实例化的职责推迟到子类中。 **适用性** 1. **当一个类不知道它所必须创建的对象的类的时候**:例如,当我们希望创建一个对象,但这个对象的具体类型需要运行时才能确定时。 2. **当一个类希望由它的子类来指定它所创建的对象的时候**:这使得类可以保持对所创建对象类型的独立性。 3. **当将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候**:这样可以让系统更加灵活地选择合适的创建者。 **参与者** 1. **Product**:定义工厂方法所创建的对象的接口或抽象类。 2. **ConcreteProduct**:实现Product接口的具体产品类。 3. **Creator**:声明工厂方法的接口或抽象类。 4. **ConcreteCreator**:实现Creator接口中的工厂方法,并返回一个ConcreteProduct实例。 **示例代码** ```java // Product Interface public interface Work { void doWork(); } // Concrete Products 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 { @Override public Work getWork() { return new StudentWork(); } } public class TeacherWorkFactory implements IWorkFactory { @Override public Work getWork() { return new TeacherWork(); } } ``` **类图** ```plaintext +----------------+ +-------------------+ | IWorkFactory |------| ConcreteProduct | | | | | | +getWork() | | +doWork() | +----------------+ +-------------------+ /\ / \ +---------+ +--------------+ | Client |----- | ConcreteProduct | +---------+ +--------------+ ``` **实际应用** 在Java开发中,工厂方法模式经常被用来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。例如,在构建用户界面时,可能会根据不同的操作系统创建不同的组件。 --- ###### 1.1.2 抽象工厂 **抽象工厂模式**提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式比工厂方法模式更为抽象,因为它不仅可以创建单一类型的产品,还可以创建一个产品族。 **适用性** 1. **当一个系统应该独立于它的产品创建、组合方式时**:这样可以在不修改代码的情况下改变产品的创建方式。 2. **当一个系统要由多个产品系列中的一个来配置时**:例如,选择不同的主题风格或操作系统的界面元素。 3. **当要强调一系列相关的产品对象的设计以便进行联合使用时**:确保它们来自同一个工厂,以支持产品的可互换性。 **参与者** 1. **Product**:定义由工厂创建的产品接口或抽象类。 2. **ConcreteProduct**:实现Product接口的具体产品类。 3. **AbstractFactory**:声明创建一系列Product的方法。 4. **ConcreteFactory**:实现AbstractFactory接口中的方法,返回相应的ConcreteProduct实例。 **示例代码** ```java // Product Interfaces public interface GUIButton { void draw(); } public interface GUILabel { void draw(); } // Concrete Products public class WindowsButton implements GUIButton { @Override public void draw() { System.out.println("Draw Windows Button"); } } public class MacButton implements GUIButton { @Override public void draw() { System.out.println("Draw Mac Button"); } } public class WindowsLabel implements GUILabel { @Override public void draw() { System.out.println("Draw Windows Label"); } } public class MacLabel implements GUILabel { @Override public void draw() { System.out.println("Draw Mac Label"); } } // Abstract Factory public interface GUIFactory { GUIButton createButton(); GUILabel createLabel(); } // Concrete Factories public class WindowsFactory implements GUIFactory { @Override public GUIButton createButton() { return new WindowsButton(); } @Override public GUILabel createLabel() { return new WindowsLabel(); } } public class MacFactory implements GUIFactory { @Override public GUIButton createButton() { return new MacButton(); } @Override public GUILabel createLabel() { return new MacLabel(); } } ``` **类图** ```plaintext +-------------+ +-------------+ +----------------+ | GUIFactory |------| ConcreteGUI | | ConcreteProduct | | | | Product | | | | +createB() | | | | +draw() | | +createL() | | | +----------------+ +-------------+ +-------------+ /\ / \ +---------+ +--------------+ | Client |----- | ConcreteProduct | +---------+ +--------------+ ``` **实际应用** 抽象工厂模式常用于创建用户界面组件,如按钮、标签等。在不同的操作系统或主题中,这些组件的表现形式和行为可能不同。通过使用抽象工厂模式,可以轻松地为不同的环境创建不同的用户界面组件。 --- #### 结论 创建型设计模式如工厂方法模式和抽象工厂模式都是Java开发中非常重要的工具,它们能够帮助开发者更好地组织代码结构,提高程序的可扩展性和灵活性。通过深入理解这些模式的概念及其应用场景,开发人员可以更好地应对复杂多变的实际开发需求。
剩余63页未读,继续阅读
- 粉丝: 1
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助