### 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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Vue与uni-id的Uniapp + Unicloud多用户论坛设计源码
- 基于C++和Qt5开发的Kiran桌面小部件库设计源码
- matlab 魔术公式轮胎动力学仿真模型,可以获得不同轮胎纵向力和滑动率之间的关系,以及不同轮胎侧向力纵向力和侧偏角之间的关系
- 考虑泊位优化和多能协同的港口综合能源系统运行优化 完整复现模型,采用Gurobi求解器求解,仿真结果如图所示 matlab+gurobi
- 基于FastAdmin+Uniapp的洗护小程序前端Vue设计源码
- 常见机器人控制运动上位机源码,包涵多种运动算法 支持marilink 提供技术文档
- 基于Django框架的完整后台管理系统DjangoAdmin设计源码
- comsol模拟绝缘材料电击穿,产生电树枝
- 基于Vue框架的多人互动博客网站设计源码
- simpack CRH2型高铁车辆模型,带全部轨道谱激励
- comsol水力压裂岩石损伤耦合模型,含裂缝制作代码matlab comsol HM耦合模型 损伤模型 裂隙多孔介质注入流体引起天然裂隙,岩石产生新损伤的数值模拟,内含MATLAB裂缝函数及coms
- c#写的winform版图像脚本模块程序,已经实现halcon文件的导入导出,图形变量输入,切函数,halcon调试,适合学习融入到自己的框架程序中,vs2019直接编译
- SAR ADC 10bit 100M采样时钟 转速率50M s ENOB 9.8bit gpdk 45nm cadence管方学习教程电路 两百多页文档 最新版 电路包括但不限于:栅压自举开关
- 51单片机温度报警器C程序、proteus仿真、报告 支持按键设置上下限温度值、当实际温度不在上下限温度值之间时、蜂鸣器报警
- 两阶段鲁棒优化的主动配电网动态无功优化 关键词:两阶段鲁棒优化,CCG算法,储能 仿真算例采用33节点,采用matlab+yalmip+cplex编写,两阶段模型采用CCG算法求解 模型中一阶段变量
- 半桥LLC开关电源模块设计资料DSP数字LLC电源源代码原理图软件学习,功率100W,包含磁件设计、软件设计报告、硬件设计报告、硬件原理、主功率计算书、LLC环路设计、仿真、BOM、使用说明,调试波形