设计模式:创建型与结构型模式解析
立即解锁
发布时间: 2025-08-18 01:17:09 阅读量: 1 订阅数: 2 

### 设计模式:创建型与结构型模式解析
#### 1. 创建型设计模式概述
创建型设计模式旨在管理对象的实例化,其主要目的包括:
- 分离对象创建与系统。
- 支持通过继承进行对象创建。
- 封装系统使用的类信息。
- 保护对象创建细节。
常见的创建型设计模式有抽象工厂、建造者、工厂方法、原型、简单工厂和单例模式。
#### 2. 原型设计模式
- **目标**:减少对象创建所需的处理时间。
- **用例**:以游戏关卡创建系统为例,有一个`BaseLevel`原型类和三个具体原型类(`Dungeon`、`Forest`、`City`),每个具体原型类实现`BaseLevel`的`clone()`方法,不同的游戏关卡会应用不同的属性。
- **UML 类图**:包含`BaseLevel`类(有`clone()`方法),该方法被`Dungeon`、`Forest`、`City`三个子类重写,`LevelDriver`类包含`main()`方法驱动程序。
- **代码实现**
- **BaseLevel 类**:
```java
public abstract class BaseLevel implements Cloneable {
public String levelName;
public int numberOfNPCs;
public int numberOfTokens;
// 访问器方法
public String getLevelName() {
return levelName;
}
public int getNumberOfNPCs() {
return numberOfNPCs;
}
public int getNumberOfTokens() {
return numberOfTokens;
}
// 修改器方法
public void setLevelName(String levelName) {
this.levelName = levelName;
}
public void setNumberOfNPCs(int npc) {
this.numberOfNPCs = npc;
}
public void setNumberOfTokens(int tokens) {
this.numberOfTokens = tokens;
}
// 关卡克隆方法
public BaseLevel clone() throws CloneNotSupportedException {
return (BaseLevel)super.clone();
}
}
```
- **Dungeon 类**:
```java
public class Dungeon extends BaseLevel {
public Dungeon(String name) {
levelName = name;
}
@Override
public BaseLevel clone() throws CloneNotSupportedException {
return (Dungeon)super.clone();
}
}
```
- **Forest 类**:
```java
public class Forest extends BaseLevel {
public Forest(String name) {
levelName = name;
}
@Override
public BaseLevel clone() throws CloneNotSupportedException {
return (Forest)super.clone();
}
}
```
- **City 类**:
```java
public class City extends BaseLevel {
public City(String name) {
levelName = name;
}
@Override
public BaseLevel clone() throws CloneNotSupportedException {
return (City)super.clone();
}
}
```
- **LevelDriver 类**:
```java
public class LevelDriver {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("\n\nGAME LEVEL CREATION\n");
// 创建地下城游戏关卡
BaseLevel dungeon = new Dungeon("Slasher\'s Dungeon Level 1");
dungeon.numberOfNPCs = 500;
dungeon.numberOfTokens = 80;
// 创建森林游戏关卡
BaseLevel forest = new Forest("Acid Rain Forest Level");
forest.numberOfNPCs = 250;
forest.numberOfTokens = 120;
// 创建城市游戏关卡
BaseLevel city = new City("Industrial City Level");
city.numberOfNPCs = 319;
city.numberOfTokens = 600;
// 克隆地下城对象
BaseLevel levelClone1;
levelClone1 = dungeon.clone();
levelClone1.setLevelName("Slasher\'s Dungeon Level 2");
levelClone1.setNumberOfNPCs(1000);
levelClone1.setNumberOfTokens(40);
// 显示输出以验证功能
System.out.println("Dungeon Level information");
System.out.println("Level Name : " + dungeon.getLevelName());
System.out.println("Number of NPCS : " + dungeon.getNumberOfNPCs());
System.out.println("Number of Tokens: " + dungeon.getNumberOfTokens());
System.out.println("\nCloned Level information");
System.out.println("Level Name : " + levelClone1.getLevelName());
System.out.println("Number of NPCS : " + levelClone1.getNumberOfNPCs());
System.out.println("Number of Tokens: " + levelClone1.getNumberOfTokens());
}
}
```
#### 3. 简单工厂设计模式
- **目标**:将对象创建委托给特定的类。
- **用例**:以割草机座椅创建系统为例,包含一个抽象`LawnMowerSeat`类、两个子类(`ResidentialLawnMowerSeat`、`CommercialLawnMowerSeat`)、一个工厂类`LawnMowerSeatFactory`和一个驱动类`LawnMowerSeatDriver`。
- **UML 类图**:抽象`LawnMowerSeat`类被`ResidentialLawnMowerSeat`和`CommercialLawnMowerSeat`类继承,`LawnMowerSeatDriver`类包含`main()`方法驱动系统执行。
- **代码实现**
- **LawnMowerSeat 类**:
```java
public abstract class LawnMowerSeat {
public LawnMowerSeat() {
}
}
```
- **ResidentialLawnMowerSeat 类**:
```java
public class ResidentialLawnMowerSeat extends LawnMowerSeat {
public ResidentialLawnMowerSeat() {
System.out.println("Residential lawnmower seat with seat belt created.");
}
}
```
- **CommercialLawnMowerSeat 类**:
```java
public class CommercialLawnMowerSeat extends LawnMowerSeat {
public CommercialLawnMowerSeat() {
System.out.println("Commercial lawnmower seat with roll bar created.");
}
}
```
- **LawnMowerSeatFactory 类**:
```java
public class LawnMowerSeatFactory {
public enum LawnMowerType {RESIDENTIAL, COMMERCIAL};
public static LawnMowerSeat create(LawnMowerType mowerType) {
if (mowerType == LawnMowerType.RESIDENTIAL) {
return new ResidentialLawnMowerSeat();
} else if (mowerType == LawnMowerType.COMMERCIAL) {
return new CommercialLawnMowerSeat();
} else {
return null;
}
}
}
```
- **LawnMowerSeatDriver 类**:
```java
public class LawnMowerSeatDriver {
public static void main(String[] args) {
System.out.println("\n\n");
// 创建住宅用割草机座椅
LawnMowerSeat residential = LawnMowerSeatFactory.create(LawnMowerSeatFactory.LawnMowerType.RESIDENTIAL);
// 创建商用割草机座椅
LawnMowerSeat commercial = LawnMowerSeatFactory.create(LawnMowerSeatFactory.LawnMowerType.COMMERCIAL);
}
}
```
#### 4. 单例设计模式
- **目标**:确保一个类只有一个实例,并且该实例可以从外部访问。常用于基于安全的系统,如银行系统生成新账户号码。
- **用例**:创建一个银行账户号码生成系统,有一个单例类,系统会尝试创建多个该单例类的实例以验证功能。
- **UML 类图**:只需要`CreateBankAccount`和`AccountDriver`两个类,`AccountDriver`类包含`main()`方法驱动程序执行。
- **代码实现**
- **CreateBankAccount 类**:
```java
public class CreateBankAccount {
private static CreateBankAccount newAccount;
// 构造函数
private CreateBankAccount() {
}
public static CreateBankAccount getNewAccount() {
if (newAccount == null) {
newAccount = new CreateBankAccount();
System.out.println("New Account created.");
} else {
System.out.println("Account already opened.");
}
return newAccount;
}
}
```
- **AccountDriver 类**:
```java
public class AccountDriver {
public static void main(String[] args) {
System.out.println("\n\nBank Account Number Generation System");
// 创建新账户
CreateBankAccount account1 = CreateBankAccount.getNewAccount();
// 创建第二个账户
CreateBankAccount account2 = CreateBankAccount.getNewAccount();
}
}
```
#### 5. 结构型设计模式概述
结构型设计模式关注对象和类如何组合形成系统,可分为两类:
- **对象设计模式**:描述如何创建具有新功能的对象。
- **类设计模式**:利用继承创建接口并组合多个类形成更大的结构。
以下是结构型设计模式的范围情况:
| 对象范围 | 类范围 |
| ---- | ---- |
| 适配器对象模式 | 适配器类模式 |
| 桥接模式 | |
| 组合模式 | |
| 装饰器模式 | |
| 外观模式 | |
| 享元模式 | |
| 代理模式 | |
#### 6. 适配器设计模式
- **目标**:将一个类的接口转换为系统期望的另一个
0
0
复制全文
相关推荐










