Java设计模式简介
1. 什么是设计模式?
设计模式是一种解决软件设计问题的方案或蓝图,它可以帮助我们开发出可重用、可维护、可扩展、可理解的软件系统。设计模式提供了一种通用的解决方案,可以在特定的情况下解决某些常见的设计问题。
设计模式通常包含了一组设计原则、模式的结构和相互之间的关系,以及相应的代码示例。Java设计模式是一套用于Java语言的设计模式,它们旨在提高代码的质量、可读性和可维护性。
2. 常见的设计模式
Java设计模式可以分为三大类别:创建型模式、结构型模式和行为型模式。接下来,我们将介绍每个类别中的一些常见设计模式。
2.1 创建型模式
创建型模式主要用于创建对象的机制,将对象的创建与使用分离,以提高代码的灵活性和可维护性。
2.1.1 工厂模式
工厂模式是一种通过工厂方法或抽象工厂来创建对象的模式。它隐藏了具体实现类的细节,只暴露了接口或抽象类给外界。
// 定义一个接口
interface Shape {
void draw();
}
// 定义具体实现类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制一个圆形");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制一个矩形");
}
}
// 定义工厂类
class ShapeFactory {
public Shape getShape(String shapeType) {
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
// 使用工厂创建对象
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 获取 Circle 对象,并调用其 draw 方法
Shape circle = shapeFactory.getShape("CIRCLE");
circle.draw();
// 获取 Rectangle 对象,并调用其 draw 方法
Shape rectangle = shapeFactory.getShape("RECTANGLE");
rectangle.draw();
}
}
2.1.2 单例模式
单例模式确保一个类只有一个实例,并提供全局访问点以获取该实例。
class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void showMessage() {
System.out.println("Hello World!");
}
}
public class SingletonPatternDemo {
public static void main(String[] args) {
// 获取唯一可用的对象
Singleton singleton = Singleton.getInstance();
// 显示消息
singleton.showMessage();
}
}
2.2 结构型模式
结构型模式主要关注对象的组合,以形成更大的结构,提供了一种简化系统结构的方法。
2.2.1 适配器模式
适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。
// 接口
interface MediaPlayer {
void play(String audioType, String fileName);
}
interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
// 实现类
class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file. Name: " + fileName);
}
@Override
public void playMp4(String fileName) {
// 什么也不做
}
}
class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
// 什么也不做
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file. Name: " + fileName);
}
}
// 适配器类
class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMediaPlayer;
public Media