java23种设计模式

本文详细介绍了面向对象设计中的23种模式,分为创建型、结构型和行为型三大类,包括单例、工厂、抽象工厂等创建模式,以及适配器、桥接等结构模式,以及策略、观察者等行为模式,为开发者提供了复用和解决问题的常见方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据经典的《设计模式:可复用面向对象软件的基础》一书,共有23种设计模式,它们被分为三种类型:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。这些设计模式包括但不限于:

创建型模式:
1. 单例模式(Singleton Pattern)
2. 工厂模式(Factory Pattern)
3. 抽象工厂模式(Abstract Factory Pattern)
4. 建造者模式(Builder Pattern)
5. 原型模式(Prototype Pattern)

结构型模式:
1. 适配器模式(Adapter Pattern)
2. 桥接模式(Bridge Pattern)
3. 组合模式(Composite Pattern)
4. 装饰器模式(Decorator Pattern)
5. 外观模式(Facade Pattern)
6. 享元模式(Flyweight Pattern)
7. 代理模式(Proxy Pattern)

行为型模式:
1. 策略模式(Strategy Pattern)
2. 模板方法模式(Template Method Pattern)
3. 观察者模式(Observer Pattern)
4. 迭代器模式(Iterator Pattern)
5. 责任链模式(Chain of Responsibility Pattern)
6. 命令模式(Command Pattern)
7. 备忘录模式(Memento Pattern)
8. 状态模式(State Pattern)
9. 访问者模式(Visitor Pattern)
10. 中介者模式(Mediator Pattern)
11. 解释器模式(Interpreter Pattern)

这些设计模式是面向对象软件开发中常用的模式,它们可以帮助开发人员解决特定类型的问题,并提供了一种可重用的解决方案。

创建型模式是设计模式的一种类型,用于处理对象的创建机制,以便在不同情况下创建对象的实例。创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。

示例代码:
```java
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
```

2. 工厂模式(Factory Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。

示例代码:
```java
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}
```

3. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

示例代码:
```java
public interface Color {
    void fill();
}

public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Inside Red::fill() method.");
    }
}

public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("Inside Blue::fill() method.");
    }
}

public abstract class AbstractFactory {
    public abstract Color getColor(String color);
}

public class ColorFactory extends AbstractFactory {
    @Override
    public Color getColor(String color) {
        if (color == null) {
            return null;
        }
        if (color.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (color.equalsIgnoreCase("BLUE")) {
            return new Blue();
        }
        return null;
    }
}
```

4. 建造者模式(Builder Pattern):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

示例代码:
```java
public class Product {
    private String part1;
    private String part2;

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public void show() {
        System.out.println("Part1: " + part1);
        System.out.println("Part2: " + part2);
    }
}

public interface Builder {
    void buildPart1();

    void buildPart2();

    Product getResult();
}

public class ConcreteBuilder implements Builder {
    private Product product = new Product();

    @Override
    public void buildPart1() {
        product.setPart1("Part1");
    }

    @Override
    public void buildPart2() {
        product.setPart2("Part2");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

public class Director {
    public Product construct(Builder builder) {
        builder.buildPart1();
        builder.buildPart2();
        return builder.getResult();
    }
}
```

5. 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

示例代码:
```java
public abstract class Shape implements Cloneable {
    private String id;
    protected String type;

    abstract void draw();

    public String getType() {
        return type;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

public class Circle extends Shape {
    public Circle() {
        type = "Circle";
    }

    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Rectangle extends Shape {
    public Rectangle() {
        type = "Rectangle";
    }

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}
```

这些示例代码展示了创建型模式的几种类型,并说明了它们的用途和实现方式。这些设计模式在实际的软件开发中经常被使用,可以帮助开发人员更好地组织和管理对象的创建过程。

结构型模式主要关注如何组合类和对象以获得更大的结构。它们可以帮助我们构建更大的系统,同时保持系统的灵活性和可变性。以下是几种常见的结构型模式及其示例代码:

1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器模式可以让原本由于接口不兼容而不能一起工作的类可以一起工作。

示例代码:
```java
public interface MediaPlayer {
    void play(String audioType, String fileName);
}

public interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // Do nothing
    }
}

public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        // Do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

public class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}

public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}
```

2. 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们可以独立地变化。

示例代码:
```java
public interface DrawAPI {
    void drawCircle(int radius, int x, int y);
}

public class RedCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}

public class GreenCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}

public abstract class Shape {
    protected DrawAPI drawAPI;

    protected Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    public abstract void draw();
}

public class Circle extends Shape {
    private int x, y, radius;

    public Circle(int x, int y, int radius, DrawAPI drawAPI) {
        super(drawAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
        drawAPI.drawCircle(radius, x, y);
    }
}
```

3. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

示例代码:
```java
import java.util.ArrayList;
import java.util.List;

public interface Employee {
    void showEmployeeDetails();
}

public class Developer implements Employee {
    private String name;
    private String position;

    public Developer(String name, String position) {
        this.name = name;
        this.position = position;
    }

    @Override
    public void showEmployeeDetails() {
        System.out.println("Developer: [ Name: " + name + ", Position: " + position + " ]");
    }
}

public class Manager implements Employee {
    private String name;
    private String position;

    private List<Employee> employees = new ArrayList<>();

    public Manager(String name, String position) {
        this.name = name;
        this.position = position;
    }

    public void addEmployee(Employee employee) {
        employees.add(employee);
    }

    public void removeEmployee(Employee employee) {
        employees.remove(employee);
    }

    @Override
    public void showEmployeeDetails() {
        System.out.println("Manager: [ Name: " + name + ", Position: " + position + " ]");
        for (Employee employee : employees) {
            employee.showEmployeeDetails();
        }
    }
}
```

以上是一些常见的结构型模式及其示例代码。这些设计模式可以帮助开发人员更好地组织和管理类和对象之间的关系,从而提高系统的可扩展性和灵活性。

行为型模式是一种设计模式,用于描述对象之间的职责分配和协作。它们关注对象之间的通信、职责分配和算法的分配。行为型模式可以帮助开发人员更好地组织对象之间的交互,并提供一种灵活的方式来实现对象之间的通信和协作。

以下是一些常见的行为型模式及其示例代码:

1. 模板方法模式(Template Method Pattern):定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。

示例代码:
```java
public abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }
}

public class Cricket extends Game {
    @Override
    void initialize() {
        System.out.println("Cricket Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Cricket Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Cricket Game Finished!");
    }
}

public class Football extends Game {
    @Override
    void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }
}
```

2. 观察者模式(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。

示例代码:
```java
import java.util.ArrayList;
import java.util.List;

public interface Subject {
    void register(Observer observer);
    void unregister(Observer observer);
    void notifyObservers();
}

public class WeatherStation implements Subject {
    private int temperature;
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void register(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void unregister(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature);
        }
    }

    public void setTemperature(int temperature) {
        this.temperature = temperature;
        notifyObservers();
    }
}

public interface Observer {
    void update(int temperature);
}

public class PhoneDisplay implements Observer {
    @Override
    public void update(int temperature) {
        System.out.println("Phone Display: Temperature changed to " + temperature);
    }
}

public class LaptopDisplay implements Observer {
    @Override
    public void update(int temperature) {
        System.out.println("Laptop Display: Temperature changed to " + temperature);
    }
}
```

3. 策略模式(Strategy Pattern):定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式可以让算法的变化独立于使用它的客户端。

示例代码:
```java
public interface Strategy {
    int doOperation(int num1, int num2);
}

public class AddOperation implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

public class SubtractOperation implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}
```

以上是一些常见的行为型模式及其示例代码。这些设计模式可以帮助开发人员更好地组织对象之间的交互和算法的分配,从而提高系统的灵活性和可维护性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值